我正在尝试让Entity Framework以特定的方式创建表,以实现特殊的1对1关系。
假设我有这组课程:
public class Parent
{
public int ID { get; set; }
public string Title { get; set; }
public Child XYZ { get; set; }
}
public class Child
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
}
XYZ
类的Parent
属性可以设置为Child
的实例。我希望EF为这两个类中的每一个创建一个表,而Child
个对象的表应该只有一个外键列,理想地命名为“ParentID”,以保持与Parent
的关系宾语。
我不想在Parent表中使用“ChildID”列,我也不想在Child
类中添加ID或ParentID属性。
目前,Child
对象的属性在Parent表中创建为列,如果XYZ属性未设置为Child
类的实例,则会出现异常,即它不能为空。
我正在尝试使用DbModelBuilder和OnModelCreating事件。 IsOptional method仅适用于简单类型。
有什么建议吗?这甚至可以用EF吗?
答案 0 :(得分:2)
目前,Child对象的属性是作为列创建的 在父表中,如果XYZ属性不是,我会得到一个例外 设置为Child类的实例,即它不能为null。
是的,它不能为null,因为当前您的Child
是一个复杂类型(值对象),并且必须始终设置它(它是实体的一部分,如果没有此部分,实体就不存在)。如果复杂类型的内容是可选的,则必须在Child的属性上强制执行此操作,而不是Child
本身。
我不想在Child类中添加ID或ParentID属性。
如果您希望将Child
映射到单独的表,则必须具有ID
,因为每个实体都必须具有主键。该ID还将用作Parent
的外键以实现一对一关系:
public class Child
{
public int Id { get; set; }
public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
}
关系映射:
modelBuilder.Entity<Parent>()
.HasOptional(p => p.XYZ)
.WithRequired();
答案 1 :(得分:1)
实体框架需要1-1关系来共享相同的主键,这意味着您的孩子必须拥有父母的外键,并且该字段也必须是孩子的主键。
你可能不喜欢这样,但EF不会以任何其他方式工作。所以要么你接受它,要么继续前进,或者你找到一个不同的框架。