【发布时间】:2011-08-20 03:42:26
【问题描述】:
如何仅使用导航属性集合创建 + 持久化 + 拥有代理到代码优先 poco 的新实例?在下面的代码中,如果使用成员函数创建 POCO,然后再创建 POCO,我将展示您可能希望如何执行此操作。您没有 DbContext,但如果您创建一个对象并使用 DbSet.Add 将其持久化,则返回的对象不是代理,因此您不能反过来使用其 DbSet.Add 添加不同的子对象.
在此代码中,如果您调用 MailingList.AddIncomingMessage("my message"),则会在“OOPS”注释处收到异常,因为创建的 msg 不是代理,因此其 Message.doodads 属性为空。
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,但我在实际代码中使用它们。
【问题讨论】:
-
对于遇到此问题的其他人,请查看 Alex 对 stackoverflow.com/questions/5974448/…的评论
标签: entity-framework-4.1 ef-code-first