代码之家  ›  专栏  ›  技术社区  ›  LCJ

添加对导致异常的实体的引用

  •  0
  • LCJ  · 技术社区  · 14 年前

    我有一个如下所示的模型(使用 模型优先 方法)。

    书是一种畅销品。DigitalDisc是一种畅销商品。这一切正常,数据被正确地插入数据库。

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

    更新条目时出错。

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

    如何克服这一点?

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

    enter image description here

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

    错误1错误113:多重性在关系“PurchaseSellingItem”中的角色“Purchase”中无效。由于从属角色中的所有属性都可以为null,因此主体角色的多重性必须为“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?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Ladislav Mrnka    14 年前

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

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