两个实体之间的一对一关系,这两个实体都继承自同一抽象类

本文关键字:两个 实体 继承 抽象类 一对一 之间 关系 | 更新日期: 2023-09-27 18:27:23

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

[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);

两个实体之间的一对一关系,这两个实体都继承自同一抽象类

尝试以下操作:

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

编辑:

问题是你的继承实现-为什么不解释一下你试图用继承策略实现什么-我猜你希望文件夹/内容元组包含与AbstractObjects实体表示的数据完全相同的数据,但在你的实现中,文件夹和内容实体将有自己独特的AbstractObject数据副本。

如果是这种情况,您有两个选项-将"文件夹"answers"内容"定义为位于同一个表中,并使用表拆分来定义"文件夹"实体和"内容》实体。第二种选择是在实体之间使用共享主键。

如果不是这样,您希望关联的Folder和Content实体有可能具有不同的AbstractObject值;您应该删除AbstractObject实体类定义上的表注释,以便将它们的值合并到FolderObjects和ContentObjects表中。

经过一些搜索(谷歌搜索),我发现我需要对Content类型的FolderId字段(显式创建)进行唯一约束,但EF目前不支持字段的唯一约束。因此,这种关系是一对多的。感谢所有参与者!!!