我想在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.AcceptedOffer
和Request.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);
}
}