1

我有一個Web應用程序(MVC 5,EntityFramework 6)。它通過DbContext連接到SQL數據庫。我遇到了一個問題,添加一個新的實體對象在實體集(但不是數據庫)中創建了重複條目,我不知道如何阻止這種情況發生。EF 6,將實體添加到DbContext創建重複的實體

控制器,其方法通過Ajax請求被稱爲:

public class CustomerController : Controller 
{ 
    MyDBEntities db = new MyDBEntities(); //DbContext 

    public ActionResult SaveStuff(string customerId, string stuff) 
    { 
     Customer customer = db.Single(c => c.ID.Equals(customerId)); 
     Stuff stuff = new Stuff(stuff, customer); 
     db.Stuffs.Add(stuff); 
     db.SaveChanges(); 

     return PartialView("MyControl", customer); 
    } 
} 

有顧客和東西之間的1-to-many關聯,並且在客戶一個「東西」導航屬性。

東西包括爲INT,和日期時間字段。

控制器方法返回一個由JavaScript使用的PartialView來刷新控件的內容。

將顯示「myControl」控制做到這一點:

var stuffs = Model.Stuffs.OrderByDescending(...); 

當控制在這種情況下渲染,Model.Stuffs包含重複的條目。有一個名爲Stuff(可能是在控制方法中創建的新對象)的條目,以及名稱爲System.Data.Entity.DynamicProxies.Stuff_<uuid>的條目,這些條目具有相同的確切數據(我想象的是從數據庫中讀取的)。

這只是一個問題,當我寫入,然後從同一Web請求中設置的實體讀取。其他/將來的Web請求導致讀取沒有問題。我怎樣才能使這項工作正確?

+0

「MyDBEntities.Configuration.ProxyCreationEnabled」的值是什麼? – 2014-11-06 05:37:09

+0

您正在添加新條目。是否確定數據庫中沒有相同條目的條目?在這種情況下,您可能需要編輯同一條目 – Jags 2014-11-06 05:43:11

+0

'Configuration.ProxyCreationEnabled'肯定已啓用,@VDohnal – 2014-11-06 06:03:56

回答

0

發生這種情況是因爲DateTime對象在寫入SQL數據庫時正在失去精度(請參閱:SQL Server DateTime vs .NET DateTime)。從DB讀回時,它具有不同的值,因此不會覆蓋db.Stuffs中本地仍存在的現有「stuff」對象。

一個簡單的解決辦法是改變日期時間的setter的東西給私人,並添加已四捨五入內置到它自己的僞setter函數:

public void SetTimestamp(DateTime timestamp) 
{ 
    //Precision in SQL is lower than in .NET, so just round to tenth seconds 
    this.Updated = timestamp.AddTicks(- (timestamp.Ticks % (TimeSpan.TicksPerSecond/10))); 
} 

在SQL數據庫中使用DATETIME2(服務器2008+ )也是一種選擇,如果您需要保持這種精確度。

+0

不應插入新對象,最多隻會更新現有行。 – 2014-11-12 04:28:22

+0

那麼,DateTime是表格鍵的一部分,因此可能會改變行爲... – 2014-11-12 05:09:31

+0

啊..是的,沒有辦法從你的問題中知道 – 2014-11-12 08:58:05