EF代码前1:*1:0.1相同型号之间的关系
本文关键字:之间 同型 关系 代码 EF | 更新日期: 2023-09-27 17:58:36
我有两种型号的
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"中无效。由于Dependent Role属性不是键属性,因此Dependent角色的多重性的上限必须为"*"。
我想我的麻烦是试图向EF描述这是两种不同的关系,而不是前后描述的相同关系。有人能指导我吗?
编辑:添加一个真实生活中的示例
我需要模拟一系列的教学课程(每个课程都被称为"模块")。所有"模块"都代表一个网页,传达特定课程的信息。每个模块可以有许多"资源"(可下载的二进制文件)。
某些模块可以具有表示与网页相同信息的Resource。在某些模块中,可以有一个可以打印出来并消耗的资源,而不是坐在机器前阅读网页。该网页的PDF版本。
因此,在上面的每个模块都有许多资源。但每个模块都可以有一个"特殊"资源,需要单独调用,也可以在使用其他资源的地方调用。
我曾考虑在Resource上设置一个标志,表示某个资源在某种程度上是特殊的,但这将允许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);