如何附加不是來自數據庫的Entity Framework對象?

.net-3.5 c# entity-framework linq-to-entities

我完全分離了我的Entity Framework對象和我的POCO對象,我只是來回翻譯它們......

即:

// poco
public class Author
{
   public Guid Id { get; set; }
   public string UserName { get; set; }
}

然後我有一個EF對象“作者”具有相同的屬性..

所以我有我的業務對象

var author = new Author { UserName="foo", Id="Guid thats in the db" };

我想保存此對象,所以我執行以下操作:

var dbAuthor = new dbAuthor { Id=author.Id, UserName=author.UserName };
entities.Attach(dbAuthor);
entities.SaveChanges();

但這給了我以下錯誤:

具有null EntityKey值的對象無法附加到對像上下文。

編輯:看起來我必須使用entities.AttachTo(“作者”,dbAuthor);沒有EntityKey附加,但後來我有硬編碼的魔術字符串,如果我改變我的實體集名稱將會破壞我不會有任何編譯時間檢查...有沒有一種方法可以附加,保持編譯時間檢查?

我希望我能夠做到這一點,因為硬編碼字符串會導致編譯時間驗證失敗=)

一般承認的答案

您是否嘗試過使用AttachTo並指定實體集?

entities.AttachTo("Authors", dbAuthor);

其中"Authors"將是您的實際實體集名稱。

編輯:
是的,有更好的方法(應該有)。設計者應該為ObjectContext生成“添加”方法 ,轉換為上面的調用..所以你應該能夠做到:

entities.AddToAuthors(dbAuthor);

這應該是:

public void AddToAuthors(Authors authors)
{
    base.AddObject("Authors", authors);
}

在whateverobjectcontext.designer.cs文件中定義。


熱門答案

剛剛看到這個。如果你想Attach()到ObjectContext,即說服實體框架已經存在數據庫中的實體,並且你想避免使用魔術字符串,即

ctx.AttachTo("EntitySet", entity);

你可以嘗試兩種基於擴展方法的可能性,這兩種方法都可以讓生活變得更加可以忍受。

第一個選項允許您編寫:

ctx.AttachToDefault(entity);

並在此處介紹: 技巧13 - 如何以簡單的方式附加實體

第二個選項允許您編寫:

ctx.EntitySet.Attach(entity);

並在此處介紹: 技巧16 - 今天如何模仿.NET 4.0的ObjectSet

正如您所看到的,兩者都非常易於使用並完全避免使用字符串。

希望這可以幫助

亞歷克斯



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因