[英]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.