0

我使用MVC3和EF4代碼優先。我有以下型號:MVC3 EF4在保存時複製外鍵對象

public class Order { 

    public int ID { get; set; } 

    [Required] 
    public float Price { get; set; } 

    [Required] 
    public int PayMethodId { get; set; } 
    public PayMethod PayMethod { get; set; } 

    public int? SpecificEventId { get; set; } 
    public SpecificEvent SpecificEvent { get; set; } 

    public int? SeasonalTicketId { get; set; } 
    public SeasonalTicket SeasonalTicket { get; set; } 
} 

當我嘗試保存Order對象與specificEventId = 2specificEvent = X,新SpecificEvent對象在數據庫中創建的,即使是已經在一個數據庫中的特定事件X與ID 2 。當我嘗試使用specificEventId = 2specificEvent = null時,我收到數據驗證錯誤。

我在做什麼錯?我希望SpecificEventSeasonalTicket爲空,並且我不希望EF4在保存「訂單」時在數據庫中創建這些對象的新實例。

更新

這是我在DB節省Order代碼:

public void SaveOrder(Order order) 
{ 
    Order fromDb = null; 

    // If editing an existing object. 
    if ((fromDb = GetOrder(order.ID)) != null) 
    { 
     db = new TicketsDbContext(); 
     db.Entry(order).State = System.Data.EntityState.Modified; 
     db.SaveChanges(); 
    } 
    // If adding a new object. 
    else 
    { 
     db.orders.Add(order); 
     db.SaveChanges(); 
    } 
} 

當我保存,我也達到else條款。

+0

這是關於EF的最常見問題,所以我想知道你在問這個問題之前搜索了什麼? –

+0

@Ladislav:我搜索了「ef \ mvc可選外鍵」,「ef \ mvc對象在保存時重複」等等......我發現了一些與我的案例接近的例子,但它仍然不適用於我。也許我錯過了一些東西(儘管我確實檢查了一下自己),或者我找到了錯誤的東西。我試圖調試這個bug幾個小時了(我是一種EF noob :)。如果你認爲我錯過了一些顯而易見的東西,或者對我可以尋找的其他東西有任何建議,我會非常樂意聽到:) – Ofirov

+0

您應該添加您的代碼以將實體保存到您的問題中。 –

回答

1

真正的問題是,你從哪裏得到X的實例?看起來EF似乎沒有這個實例的知識。您需要通過EF獲取已存在的SpecificEvent並使用它返回的代理來設置導航屬性,或者告知EF「附加」X,以便它知道您的意圖是什麼。據EF知道,看起來,你正在嘗試向它發送一個衝突的Id的新實例,所以它正確地發出錯誤。

+0

我使用EF從數據庫中獲得了它,當然,當我在調試模式下查看對象時,似乎ID是正確的(匹配Order中的ID和DB中的ID)。我確實從服務器獲得了之前的請求並將其保存在會話中,但我僅在以下請求中進行了實際的保存嘗試。據我的理解,這不是一個問題。 – Ofirov

+1

在這種情況下,它來自不同的上下文,來自先前請求的那個可能已經過去了。您需要將其附加到新的上下文中。 –

+0

謝謝!就是這樣:) – Ofirov