EF Core可选1对1关系

问题描述 投票:0回答:1

我遇到了一种情况,需要在 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数据时出现以下错误:

外键约束失败(

...
...
,约束
...
外键(
...
)参考
...
...
)删除级联)

c# entity-framework-core
1个回答
0
投票

您需要在您的SupplierBook上创建外键

[ForeignKey("BookOverride")]
public int BookId { get; set; }

也可以为空 -

public int? BookId { get; set; }
,因为这是具有“非必需”语义的关系的一面。

但是您设置模型的方式意味着每次您使用 BookID 值实例化您的 sellerBook 时,您基本上都会添加一个 bookOverride,这可能不是您想要的。您应该从 BookOverride 模型中删除

[ForeignKey("BookId")]
才能正确设置关系。

您可以在此处阅读更多内容MS Docs

© www.soinside.com 2019 - 2024. All rights reserved.