实体框架创建的自定义1对1关系

时间:2012-08-31 17:14:47

标签: c# .net entity-framework

我正在尝试让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吗?

2 个答案:

答案 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不会以任何其他方式工作。所以要么你接受它,要么继续前进,或者你找到一个不同的框架。