如何使用代理获取新创建的实体?

时间:2015-02-09 22:04:24

标签: c# entity-framework

当我在上下文中创建新实体时,即使我再次请求它,也无法获得代理。我必须处理上下文并制作一个新的上下文。这是预期的行为还是我做错了什么?

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!
}

2 个答案:

答案 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);