繁体   English   中英

实体框架-两个导航属性,一个键?

[英]Entity Framework - Two Navigation Properties, One Key?

我已经花了几个小时试图用Google搜索这个问题的答案,但是我什么也没想出来。 我希望这只是我不知道该怎么说,而不是技术限制。

我正在使用Entity Framework Code-First(v5),并且试图创建一个模型,该模型具有两个共享单个外键的导航属性。 显然,此外键不能存在于数据库中,因为它不能指向两个子表。 EF是否能够解决此问题,并且仍然使用自定义映射或注释找出我想要的东西?

例:

public class Parent {
  public int Id { get; set; }
  public string EntityType { get; set; }
  public int EntityId { get; set; }
  // Additional properties

  [SomeSortOfAttributeICanPutHereToIndicateThisShouldUse("EntityId")] //?
  public virtual Child1 { get; }
  [SomeSortOfAttributeICanPutHereToIndicateThisShouldUse("EntityId")] //?
  public virtual Child2 { get; }
}

public class Child1 {
  public int Id { get; set; }
  public string Prop1 { get; set; }
}

public class Child2 {
  public int Id { get; set; }
  public string Prop2 { get; set; }
}

public Database : DbContext {
  public DbSet<Parent> Parents { get; set; }
  public DbSet<Child1> Children1 { get; set; }
  public DbSet<Child2> Children2 { get; set; }
}

var db = new Database();
var child1prop = db.Parents.First(p => p.EntityType == "Child1").Child1.Prop1;
var child2prop = db.Parents.First(p => p.EntityType == "Child2").Child2.Prop2;

我正在尝试使用实体框架做什么,还是我在浪费时间?

我想一种更好的处理方法是在Parent实体上有一个孩子集合? 这是一个简单的一对多关系。

父类将包含一个子代集合,并且子代将引用其父代,然后父代可以有x个子代,而不是两个。

public class Parent {
  public int Id { get; set; }
  // Additional properties

  public virtual List<Child> Children { get; set; }
}

public class Child {
  public int Id { get; set; }
  public string Prop1 { get; set; }

  public int ParentId { get; set; }
  public Parent Parent { get; set; }
}

public Database : DbContext {
  public DbSet<Parent> Parents { get; set; }
  public DbSet<Child> Children { get; set; }
}

我认为这是不可能的。 这听起来像是试图将FK约束从parent.cid设置为child1.cid,从parent.cid设置为child2.cid。

我只是测试:这似乎有可能(?!!#!):

CREATE TABLE [dbo].[parent](
    [pid] [int] NOT NULL,
    [cid] [int] NULL,
 CONSTRAINT [PK_parent] PRIMARY KEY CLUSTERED 
(
    [pid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[parent]  WITH CHECK ADD  CONSTRAINT [FK_parent_child1] FOREIGN KEY([cid])
REFERENCES [dbo].[child1] ([cid])
GO

ALTER TABLE [dbo].[parent] CHECK CONSTRAINT [FK_parent_child1]
GO

ALTER TABLE [dbo].[parent]  WITH CHECK ADD  CONSTRAINT [FK_parent_child2] FOREIGN KEY([cid])
REFERENCES [dbo].[child2] ([cid])
GO

ALTER TABLE [dbo].[parent] CHECK CONSTRAINT [FK_parent_child2]
GO

但:

这意味着当您将值设置为parent.cid时,child1和child2中都必须有一行。

恕我直言,这会导致精神分裂症。

面对同样的问题,我辞职有两个FK。

另一个选择是继承:

class base {
    int id {get; set;}
}

class child1 : base {
}

class child2 : base {
}

然后配置一个TPT。 这将导致针对child1和child2的三个表。

在您的父母中,您可以拥有base类型的属性。 然后由您决定将此属性作为child1或child2来处理。

希望这会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM