簡體   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