繁体   English   中英

EF代码优先1:相同模型之间的1:* 1:0..1关系

[英]EF code-first 1:* 1:0..1 relationship between the same models

我有两个模型

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”中无效。 因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为'*'。

我认为我的麻烦是试图向EF描述这是两个独立的关系,而不是前后描述的相同关系。 有人可以在这方面指导我吗?

编辑:添加一个真实的例子

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

某些模块可以具有表示与网页相同的信息的资源。 与在某些模块中一样,可以将资源打印出来并消耗掉,而不必坐在机器前浏览网页。 网页的PDF版本。

因此,在上面的每个模块中都有许多资源。 但是,每个模块可以选择具有“特殊”资源,无论使用什么其他资源,都需要分别调用它。

我考虑过在Resource上放一个标志,以某种方式表明资源是特殊的,但这将允许0 .. *,这不是我想要的。 我认为这可能更干净。 但是到目前为止,我还无法使它与EF一起使用。

这是一个工作示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM