【问题标题】:Adding reference to entity causing Exception添加对导致异常的实体的引用
【发布时间】:2023-03-03 05:43:18
【问题描述】:

我有一个如下所示的模型(使用 Model-First 方法创建)。

一本书是一种销售物品。 DigitalDisc 是一种销售商品。这工作正常,数据被正确插入到数据库中。

我正在添加一个名为“Purchase”的新实体。一次购买包含多个销售项目。一旦我添加了这个新关联并更新了数据库模式,我就会得到以下异常。

更新条目时出错。

“INSERT 语句与 FOREIGN KEY 约束 \"FK_PurchaseSellingItem\" 冲突。冲突发生在数据库 \"LibraryReservationSystem\",表 \"dbo.Purchases\",列 'PurchaseId'。\r\n该语句有已终止。"}

如何克服这个问题?

注意:我需要创建一本书(比如将书籍数据输入数据库)。这本书可能会或可能不会发生购买。创建书时,该书的外键列应为空。但是当该列更新时,它应该是 Purchase 表中存在的 ID 可能吗?

注意:当我尝试使模型中的“PurchasePurchaseId”字段为空时,我收到以下错误:

错误 1 ​​错误 113:多重性在关系“PurchaseSellingItem”中的角色“Purchase”中无效。因为从属角色中的所有属性都可以为空,所以主体角色的多重性必须为“0..1”。 C:\Documents and Settings\U16990\My Documents\Visual Studio 2010\Projects\LijosEF\LijosEF\MyModelFirstTest.edmx 35 3 LijosEF

代码

class Program
{

    static string connectionStringVal;

    static void Main(string[] args)
    {

        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
        sqlBuilder.DataSource = ".";
        sqlBuilder.InitialCatalog = "LibraryReservationSystem";
        sqlBuilder.IntegratedSecurity = true;

        // Initialize the EntityConnectionStringBuilder.
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        entityBuilder.Provider = "System.Data.SqlClient";
        entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
        entityBuilder.Metadata = @"res://*/MyModelFirstTest.csdl|res://*/MyModelFirstTest.ssdl|res://*/MyModelFirstTest.msl";

        connectionStringVal = entityBuilder.ToString();


        AddBook();
        AddDisc();





    }

    private static void AddBook()
    {

        //string connectionstring = "Data Source=.;Initial Catalog=SalesDB;Integrated Security=True;Connect Timeout=30";
        using (var db = new MyModelFirstTestContainer(connectionStringVal))
        {
            Book book = new Book();
            book.AvailabilityStatus = "Available";
            book.Price = 150;
            book.Title = "Maths Easy";

            db.SellingItems.AddObject(book);
            db.SaveChanges();

        }

    }

    private static void AddDisc()
    {

        //string connectionstring = "Data Source=.;Initial Catalog=SalesDB;Integrated Security=True;Connect Timeout=30";
        using (var db = new MyModelFirstTestContainer(connectionStringVal))
        {
            DigitalDisc disc = new DigitalDisc();
            disc.AvailabilityStatus = "Available";
            disc.Price = 300;
            disc.Artist = "Turtle Violin";

            db.SellingItems.AddObject(disc);
            db.SaveChanges();

        }

    }

}

参考:

  1. Database design - articles, blog posts, photos, stories

  2. Can I get Entity Framework (model-first) to generate composite keys?

【问题讨论】:

    标签: c# .net entity-framework domain-driven-design ef-model-first


    【解决方案1】:

    您将关系配置为强制关系,但您正在保存SellingItem 而没有相关的Purchase。我希望 EF 在将记录保存到数据库之前会抛出一些异常,但它没有,它很可能会尝试为 FK 列传递默认值,而您没有任何 Purchase 和这样的 Id

    顺便说一句。你不应该使用多对多关系,因为销售物品可以多次销售,而购买可以有多个销售物品?

    【讨论】:

    • 场景如下...在我的想象场景中,每个标题只有一个副本。我需要创建一本书(比如将书籍数据输入数据库)。这本书可能会或可能不会发生购买。创建书时,该书的外键列应为空。但是当该列更新时,它应该是 Purchase 表中存在的 ID 这可能吗?
    • 是的,但你必须使用 0..1 的多重性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多