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对象的属性被创建为父表中的列,如果 XYZ 属性未设置为Child类的实例,我会得到一个异常,即它不能为空。

我正在尝试使用 DbModelBuilder 和 OnModelCreating 事件来做到这一点。IsOptional方法仅适用于简单类型。

有什么建议么?EF甚至可以做到这一点吗?

4

2 回答 2

2

目前,子对象的属性被创建为父表中的列,如果 XYZ 属性未设置为子类的实例,我会得到一个异常,即它不能为空。

是的,它不能为空,因为目前您Child是一个复杂类型(值对象),并且必须始终设置它(它是实体的一部分,没有这部分实体就不存在)。如果复杂类型的内容是可选的,则必须对 Child 的属性而不是对Child自身强制执行此操作。

我不想将 ID 或 ParentID 属性添加到 Child 类。

如果你想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();
于 2012-08-31T18:00:50.527 回答
1

Entity Framework 需要 1-1 关系来共享相同的主键,这意味着您的孩子必须有一个外键到父级,并且该字段也必须是孩子的主键。

您可能不喜欢这样,但 EF 不会以任何其他方式工作。所以要么你接受它,继续前进,要么你找到一个不同的框架。

于 2012-08-31T19:08:11.920 回答