如何通过实体框架在2个实体上一起配置一对多和可为null的一对一关系



我想在EF中配置以下模型。

  • 许多优惠可以与一个请求相关
  • 每个请求应与一个请求相关
  • 可能会接受一个报价

型号:

public class Request 
{
public Guid Id { get; set; }
// Nullable Foreign Key
public Guid? AcceptedOfferId { get; set; }    
public Offer AcceptedOffer { get; set; }

public List<Offer> Offers { get; set; }
}
public class Offer
{
public Guid Id { get; set; }
public Guid RequestId { get; set; }    
public Request Request { get; set; }
}

我应该如何配置它?

以下配置给我这个错误:

无法在"Request.Offers"one_answers"Offer.Request",因为"Request.AcceptedOffer"one_answers"Offer.Request"。导航属性可以只参与单一关系。

public class Request: IEntityTypeConfiguration<Entities.Request>
{
public void Configure(EntityTypeBuilder<Entities.Request> builder)
{
builder.HasKey(p => new { p.Id });
builder.HasOne(p => p.AcceptedOffer)
.WithOne(p => p.Request)
.HasForeignKey("Request", "AcceptedOfferId")
.OnDelete(DeleteBehavior.Restrict);  
}
}
public class Offer: IEntityTypeConfiguration<Entities.Offer>
{
public void Configure(EntityTypeBuilder<Entities.Offer> builder)
{
builder.HasKey(p => new { p.Id });
builder.HasOne(p => p.Request).WithMany(p => p.Offers).HasForeignKey(p => p.RequestId).OnDelete(DeleteBehavior.Restrict);           

}
}

问题是不能将Offer.Request用作Request.AcceptedOfferRequest.Offers逆属性(关系另一端的属性(。

第一件事是向Offer:添加第二个Request属性

public class Offer
{
public Guid Id { get; set; }
public Guid RequestId { get; set; }
public Request Request { get; set; }
public Request RequestAcceptedBy { get; set; }
}

然后更改配置(为了清楚起见,我更改了配置类名(:

public class RequestConfig : IEntityTypeConfiguration<Request>
{
public void Configure(EntityTypeBuilder<Request> builder)
{
builder.HasKey(p => new { p.Id });
builder.HasOne(p => p.AcceptedOffer)
.WithOne(o => o.RequestAcceptedBy)
.HasForeignKey<Request>(r => r.AcceptedOfferId)
.OnDelete(DeleteBehavior.Restrict);
}
}
public class OfferConfig : IEntityTypeConfiguration<Offer>
{
public void Configure(EntityTypeBuilder<Offer> builder)
{
builder.HasKey(p => new { p.Id });
builder.HasOne(p => p.Request)
.WithMany(p => p.Offers)
.HasForeignKey(p => p.RequestId);
}
}

最新更新