相同类型的多个关系

时间:2019-09-11 02:32:22

标签: c# asp.net entity-framework entity-framework-core asp.net-core-2.2

对于我的模型,我有RealEstateTransactionAgent。一个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; }
}

2 个答案:

答案 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; }

}