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

时间:2016-07-25 16:00:39

标签: c# entity-framework

我有两个型号

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

它给了我Multiplicity在Role&#39; A_MainB_Source&#39;中无效。在关系&#39; A_MainB&#39;。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为&#39; *&#39;。

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

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

我需要建立一系列教学课程(每个课程称为&#34;模块&#34;)。所有&#34;模块&#34;表示传达该特定课程信息的网页。每个模块都可以有许多资源&#34;(可下载的二进制文件)。

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

所以在上面每个模块都有很多资源。但是每个模块都可以选择具有特殊的&#34;需要单独调出的资源以及使用其他资源的地方。

我认为只是在资源上有一个标志,表明资源在某种程度上是特殊的,但这将允许0 .. *这不是我想要的。我觉得这可能更干净了。但到目前为止,我还没有能够与EF合作。

1 个答案:

答案 0 :(得分:0)

这是一个有效的例子:

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