如何使用僅導航屬性集合創建+ persist + have-a-proxy-代碼優先的poco的新實例?在下面的代碼中,如果使用成員函數創建POCO,然後創建POCO,我將展示如何執行此操作。您沒有DbContext,但是如果您創建一個對象並使用DbSet.Add保存它,則返回的對象不是代理,因此您無法反過來使用其DbSet.Add來添加不同的子對象。EF代碼首先,使用代理創建新對象集合
在此代碼中,如果您調用MailingList.AddIncomingMessage(「my message」),則會在「OOPS」註釋中收到異常,因爲創建的消息不是代理,因此其Message.doodads屬性爲null 。
class Doodad {
public int ID { get; set; }
public string doodad { get; set; };
}
class Message {
public int ID { get; set; }
public virtual MailingList mailingList { get; set; }
public virtual ICollection<Doodad> doodads { get; set; }
public string text { get; set; }
public void GetDoodadCreateIfNeeded(string doodad) {
try {
// won't be found since we just created this Message
return this.doodads.First(d => d.doodad == doodad);
} catch (Exception e) {
Doodad newDoodad = new Doodad() { doodad=doodad };
// OOPS! this.doodads == null, because its not a proxy object
this.doodads.Add(newDoodad);
return newDoodad;
}
}
}
class MailingList {
public int ID { get; set; }
public virtual ICollection<Message> messages { get; set; }
public void AddIncomingMessage(string message) {
var msg = new Message() { text=message };
// we have no Context, because we're in a POCO's member function
this.messages.Add(msg);
var doodad = msg.GetDoodadCreateIfNeeded("bongo drums");
}
}
編輯:對不起你們,我忘了把屬性訪問器和ID在該簡化的情況,但我在實際的代碼中使用它們。
給任何人遇到了這種正確的方式,檢查出http://stackoverflow.com/ Alex的評論問題/ 5974448/entityframework-4-1-dbcontext-changetracking-kill-performance – Seth