0

我有一個模型,如下所示(使用Model-First方法創建)。添加對實體引用的引用異常

一本書是一個銷售項目。 DigitalDisc是一個銷售項目。這工作正常,數據正在數據庫中正確插入。

我正在添加一個名爲「Purchase」的新實體。一次購買包含多個銷售項目。一旦我添加了這個新的關聯並更新了數據庫模式,我得到以下例外。

An error occurred while updating the entries.

"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_PurchaseSellingItem\". The conflict occurred in database \"LibraryReservationSystem\", table \"dbo.Purchases\", column 'PurchaseId'.\r\nThe statement has been terminated."}

如何克服這一點?

注:我需要創建一本書(如將書籍數據輸入到數據庫中)。本書的購買可能會或可能不會發生。在創建圖書時,該書的外鍵列應該爲空。但是,當該列被更新時,它應該是一個存在於購買表中的ID這可能嗎?

enter image description here

注:當我試圖在模型中場 「PurchasePurchaseId」 空的,我收到以下錯誤:

Error 1 Error 113: Multiplicity is not valid in Role 'Purchase' in relationship 'PurchaseSellingItem'. Because all the properties in the Dependent Role are nullable, multiplicity of the Principal Role must be '0..1'. C:\Documents and Settings\U16990\My Documents\Visual Studio 2010\Projects\LijosEF\LijosEF\MyModelFirstTest.edmx 35 3 LijosEF

CODE

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

你配置好關係是強制性的,但你沒有相關Purchase保存SellingItem。我希望EF會在將記錄保存到數據庫之前拋出一些異常,但它不會,它最有可能會嘗試傳遞FK列的默認值,並且您沒有任何PurchaseId

Btw。你不應該使用多對多的關係,而是因爲銷售物品可以多次出售,購買可以有多個銷售物品?

+0

該情景如下...在我的想象情景中,每個標題只有一個副本。我需要創建一本書(比如將書籍數據輸入數據庫)。本書的購買可能會或可能不會發生。在創建圖書時,該書的外鍵列應該爲空。但是,當該列被更新時,它應該是一個存在於購買表中的ID這可能嗎? – Lijo 2012-07-27 11:46:38

+1

是的,但您必須使用0..1的多樣性。 – 2012-07-27 11:51:39