EF代码前1:*1:0.1相同型号之间的关系

本文关键字:之间 同型 关系 代码 EF | 更新日期: 2023-09-27 17:58:36

我有两种型号的

public class A{
    public AID { get; set; }
    public int? MainBID { get; set; }
    [ForeignKey("MainBID")]
    public B MainB { get; set; }
}
public class B{
    public int BID { get; set; }
    public int? AID { get; set; }
    [ForeignKey("AID")]
    public virtual A Owner { get; set;}
}

我想建立的关系是A有很多B。A也可能有一个特别指定的B(主B)。

然而,按照我的设置方式,它很难识别主体并使用流利的

modelBuilder
    .Entity<A>()
    .HasOptional(x => x.MainB)
    .WithOptionalDependent();

它告诉我多重性在关系"A_MainB"中的角色"A_MainB_Source"中无效。由于Dependent Role属性不是键属性,因此Dependent角色的多重性的上限必须为"*"。

我想我的麻烦是试图向EF描述这是两种不同的关系,而不是前后描述的相同关系。有人能指导我吗?

编辑:添加一个真实生活中的示例

我需要模拟一系列的教学课程(每个课程都被称为"模块")。所有"模块"都代表一个网页,传达特定课程的信息。每个模块可以有许多"资源"(可下载的二进制文件)。

某些模块可以具有表示与网页相同信息的Resource。在某些模块中,可以有一个可以打印出来并消耗的资源,而不是坐在机器前阅读网页。该网页的PDF版本。

因此,在上面的每个模块都有许多资源。但每个模块都可以有一个"特殊"资源,需要单独调用,也可以在使用其他资源的地方调用。

我曾考虑在Resource上设置一个标志,表示某个资源在某种程度上是特殊的,但这将允许0..*,这不是我想要的。我觉得这可能更干净。但到目前为止,我还没能与英孚合作。

EF代码前1:*1:0.1相同型号之间的关系

这是一个工作示例:

public class Module
    {
       public int Id { get; set; }
       public string Name { get; set; }
       public ICollection<Resource> Resources { get; set; }
       public int? SpecialResourceId { get; set; }
       public Resource SpecialResource { get; set; }
    }
    public class Resource
    {
        public int Id { get; set; }
        public int? ModuleId { get; set; }
        public Module Module { get; set; }
        public virtual Module IsSpecialForModule { get; set; }
    }
    public class MyContext : DbContext
    {
        public virtual DbSet<Module> Modules { get; set; }
        public virtual DbSet<Resource> Resources { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
           modelBuilder.Entity<Module>()
                .HasMany(x=>x.Resources)
                .WithOptional(x=>x.Module)
                .HasForeignKey(x=>x.ModuleId)
                .WillCascadeOnDelete(false);
            modelBuilder.Entity<Resource>()
                .HasOptional(x=>x.IsSpecialForModule)
                .WithOptionalDependent(x=>x.SpecialResource)
                .WillCascadeOnDelete(false);
        }
    }

如果你的特殊资源,对许多模块来说都是特殊的,那么你的模型就是这样变化的:

 public class Resource
    {
        public int Id { get; set; }
        public int? ModuleId { get; set; }
        public Module Module { get; set; }
        public virtual ICollection<Module> IsSpecialForModules { get; set; }
    }

以及配置。将是:

   modelBuilder.Entity<Resources>()
                .HasMany(x=>x.IsSpecialForModules )
                .WithOptional(x=>x.SpecialResource )
                .HasForeignKey(x=>x.SpecialResourceId )
                .WillCascadeOnDelete(false);