我有两个型号
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合作。
答案 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);