2个实体之间的一对一关系,都是从同一个抽象类继承的

时间:2013-08-12 11:03:24

标签: c# entity-framework asp.net-mvc-4 one-to-one

我有2个继承相同抽象类的实体。 如何组织这些实体之间的一对一关系?

[Table("AbstractObjects")]
public abstract class AbstractObject{
    public Guid Id{get;set;}
    public string Name{get;set;}
    public DateTime CreateDate{get;set;}
}

[Table("FolderObjects")]
public class Folder:AbstractObject{
    public virtual Content Content{get;set;}
}

[Table("ContentObjects")]
public class Content:AbstractObject{
    public virtual Folder Folder{get;set;}
}

标准解决方案工作不正常,它会产生一对多的关系

modelBuilder.Entity<Folder>()
                .HasRequired(x => x.Content)
                .WithRequiredDependent(c => c.Folder);

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

modelBuilder.Entity<Folder>()
                .HasRequired(x => x.Content)
                .WithRequiredPrincipal(); // <- this is what's different

编辑:

问题在于您的继承实现 - 为什么不解释您尝试使用继承策略完成的任务 - 我猜您希望文件夹/内容元组包含由AbstractObjects实体表示的完全相同的数据,但在您的实现中,文件夹和内容实体将拥有自己的AbstractObjects数据的不同副本。

如果是这种情况,您有两个选项 - 定义文件夹和内容以生活在同一个表中,并使用table splitting来定义文件夹和内容实体。您的第二个选择是在实体之间使用shared primary keys

如果不是这种情况,您希望关联的文件夹和内容实体可以具有不同的AbstractObject值;您应该删除AbstractObject实体类定义上的表注释,以便将它们的值合并到FolderObjects和ContentObjects表中。

答案 1 :(得分:0)

在一些seaches(谷歌搜索)之后,我得到我需要对Content类型的FolderId字段(显式创建)的唯一约束,但是EF现在不支持字段的唯一约束。因此,这种关系保持一对多。感谢所有参与者!!!