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