Как я могу создать + persist + have-a-proxy-to новый экземпляр poco с первым кодом, используя только наборы свойств навигации? В приведенном ниже коде я покажу, как вы можете это сделать, если используете функции-члены для создания POCO, которые затем создают POCO. У вас нет DbContext, но если вы создаете объект и сохраняете его с помощью DbSet.Add, возвращаемый объект не является прокси, поэтому вы не можете, в свою очередь, использовать его DbSet.Add для добавления другого подобъекта. .
В этом коде, если вы вызываете MailingList.AddIncomingMessage («мое сообщение»), вы получаете исключение в комментарии «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 для этого упрощенного случая, но я использую их в фактическом коде.