对于我的模型,我有RealEstateTransaction
和Agent
。一个RealEstateTransaction
可以有一个ListingAgent
和一个SellingAgent
。
我将如何建立模型以建立这种关系?像这样吗?
public class Agent
{
public long AgentId { get; set; }
public List<RealEstateTransaction> ListingRealEstateTransactions { get; set; }
public List<RealEstateTransaction> SellingRealEstateTransactions { get; set; }
}
public class RealEstateTransaction
{
public long RealEstateTransactionId { get; set; }
public long ListingAgentId { get; set; }
public Agent ListingAgent { get; set; }
public long SellingAgentId { get; set; }
public Agent SellingAgent { get; set; }
}
答案 0 :(得分:1)
像这样吗?
确实。
但是它需要对导航属性进行一些其他映射(FK属性名称遵循EF Core约定,因此不需要任何映射)。通常,EF Core能够配对关系两端的导航属性,但是当您对一个相同的实体具有两个关系时,则无法配对。在这种情况下,您需要确定主体的哪个导航属性对应于(依赖)每个导航属性。
通常,您可以通过数据注释([InverseProperty]
属性)或流利的API来做到这一点。但是,由于与同一个实体的多个FK关系还引入了SqlServer(和其他一些数据库)所谓的多个级联路径问题,因此您还需要至少关闭级联删除功能其中一种关系,并且只能使用流利的API来完成,因此所需的最小映射如下所示:
modelBuilder.Entity<Agent>()
.HasMany(e => e.ListingRealEstateTransactions)
.WithOne(e => e.ListingAgent)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Agent>()
.HasMany(e => e.SellingRealEstateTransactions)
.WithOne(e => e.SellingAgent)
.OnDelete(DeleteBehavior.Restrict);
您可以跳过.OnDelete(DeleteBehavior.Restrict)
中的一种关系(或将其更改为DeleteBehavior.Cascade
,这是此类必需关系的默认设置)。请注意,删除主体(在这种情况下为Agent
)将需要首先手动删除具有DeleteBehavior.Restrict
的每个关系的所有相关从属。
这是必不可少的部分。可选地,如果RealEstateTransaction
实体仅用作标准的多对多“链接”实体(没有其他属性,并且对(ListingAgentId, SellingAgentId)
是唯一的),则可以删除RealEstateTransactionId
PK属性并流畅地配置复合PK:
modelBuilder.Entity<RealEstateTransaction>()
.HasKey(e = new { e.ListingAgentId, e.SellingAgentId });
参考:
答案 1 :(得分:0)
执行此操作:
public class Agent
{
public long AgentId { get; set; }
public Virtual ICollection<RealEstateTransaction> ListingRealEstateTransactions { get; set; }
public Virtual ICollection<RealEstateTransaction> SellingRealEstateTransactions { get; set; }
}
public class RealEstateTransaction
{
public long RealEstateTransactionId { get; set; }
[ForeignKey("ListingAgentId")]
public Agent ListingAgent { get; set; }
public long ListingAgentId { get; set; }
[ForeignKey("SellingAgentId ")]
public Agent SellingAgent { get; set; }
public long SellingAgentId { get; set; }
}