当我在上下文中创建新实体时,即使我再次请求它,也无法获得代理。我必须处理上下文并制作一个新的上下文。这是预期的行为还是我做错了什么?
int id = 0;
using (var context = new MyContext())
{
var A = context.People.Add(new Person{ Name = "Bob" }); // A is not a proxy
context.SaveChanges(); // A is still not a proxy
var B = context.People.Where(o => o.Id == A.Id).Single(); // B is not a proxy
id = A.Id; // Keep the ID to use with a new context
}
using (var context = new MyContext())
{
var C = context.People.Where(o => o.Id == id).Single(); // C is a proxy!
}
答案 0 :(得分:3)
您可以使用DBSet的Create
方法:
var newPerson=context.People.Create();
如果基础上下文配置为创建代理并且实体类型符合requirements for creating a proxy,则返回的实例将是代理。
正如@Asad所说,如果你要创建一个新实体,你需要在创建它之后将它添加到你的DBSet:
context.People.Add(newPerson);
或将其状态更改为Added
,例如:
context.Entry(newPerson).State = EntityState.Added;
而且,如果您要更新它,那么您应该使用Attach
方法:
var existingPerson=context.People.Create();
existingPerson.Id = 1; // assuming it exists in the DB
context.People.Attach(existingPerson);
答案 1 :(得分:1)
octavioccl的回答是正确的,但会迫使我打破我的数据层模式。我有一个替代(可能更慢)的解决方案,它没有强迫我在我的存储库中创建实体,也没有要求我在任何地方添加映射(或映射库)。我仍然接受你的答案,因为它可能更接近最佳实践,并回答了原始问题,但我想在必要时添加此选项。
dbContext.People.Add(person);
dbContext.SaveChanges();
dbContext.Entry(person).State = EntityState.Detached;
dbContext.People.Find(person.Id);