[英]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.