我遇到了一种情况,需要在 EF Core 中执行可选的 1 对 1 关系。
我已经使用书籍示例简化了我需要的内容(希望上下文仍然有意义)。
上下文是我有一个提要,该提要包含供应商出售的书籍以及他们想要出售的价格。我们是经销商,客户可以从供应商处选择一本书并直接从他们那里购买。但我们想要一种方法来覆盖所有供应商的图书价格。
public class SupplierBook
{
public int SupplierBookId { get; set; }
[ForeignKey("BookOverride")]
public int BookId { get; set; }
public int BookSupplierId { get; set; }
public decimal Price { get; set; }
public virtual BookOverride? BookOverride { get; set; }
}
public class BookOverride
{
[Key]
public int BookId { get; set; }
public decimal PriceOverride { get; set; }
[ForeignKey("BookId")]
public SupplierBook SupplierBook { get; set; }
}
public class Test
{
public void DoTest()
{
var bookFromSup1 = new SupplierBook() { SupplierBookId = 0, BookId = 10, BookSupplierId = 1, Price = 10.50M };
var bookFromSup2 = new SupplierBook() { SupplierBookId = 1, BookId = 10, BookSupplierId = 2, Price = 90.50M };
var bookFromSup3 = new SupplierBook() { SupplierBookId = 2, BookId = 11, BookSupplierId = 2, Price = 5.50M };
var priceOverride = new BookOverride() { BookId = 10, PriceOverride = 15.0M };
var context = new BookDBContext();
context.SupplierBooks.Add(bookFromSup1);
context.SupplierBooks.Add(bookFromSup2);
context.SupplierBooks.Add(bookFromSup3);
context.BookOverrides.Add(priceOverride);
context.SaveChanges();
var bookWithOveride = context.SupplierBooks
.Where(o => o.BookId = 10 && o.BookSupplierId = 2)
.Include(o => o.BookOverride).First();
Debug.WriteLine(bookWithOveride.BookOverride.PriceOverride); // prints 15.00
var bookWithNoOveride = context.SupplierBooks
.Where(o => o.BookId = 11 && o.BookSupplierId = 2)
.Include(o => o.BookOverride).First();
Debug.WriteLine(bookWithNoOveride.BookOverride == null); // prints true
}
}
使用当前方法插入SupplierBook数据时出现以下错误:
外键约束失败(
。...
,约束...
外键(...
)参考...
(...
)删除级联)...
您需要在您的SupplierBook上创建外键
[ForeignKey("BookOverride")]
public int BookId { get; set; }
也可以为空 -
public int? BookId { get; set; }
,因为这是具有“非必需”语义的关系的一面。
但是您设置模型的方式意味着每次您使用 BookID 值实例化您的 sellerBook 时,您基本上都会添加一个 bookOverride,这可能不是您想要的。您应该从 BookOverride 模型中删除
[ForeignKey("BookId")]
才能正确设置关系。
您可以在此处阅读更多内容MS Docs