EF代码第一:为什么实体在找到它后被分离

本文关键字:分离 实体 代码 为什么 EF | 更新日期: 2023-09-27 18:13:52

我正在开发一个小型web应用程序,我决定首先使用实体框架(v6.1.x)代码。我想创建一个新的数据库条目-一个"报价"。在"要约"类中,也存储了该要约所属的"客户"。

好吧,没什么特别的,我想…在创建新报价之前,我先从数据库中检索客户。我创建了新的报价并设置了Customer属性。在上下文上调用SaveChanges之后,我在客户数据库中有了客户的副本。在做了一些调试之后,我发现客户实体有EntryState Detached…为什么?

下面是一些代码片段:

MVC控制器

 var customer = default(Customer);
 if (model.SelectedCustomerID > 0)
            customer= _customerRepository.FindById(model.SelectedCustomerID );
// create new instance of offer
var offer = new Offer
{
  // set all necessary properties
  // ...
  Customer = customer
}
_offerRepository.AddOffer(offer);
_offerRepository.Save();
客户Repository.cs

private readonly IDatabaseContext _context;
// DatabaseContext is injected by AutoFac
public CustomerRepository(IDatabaseContext context)
{
     _context = context;
}
public CustomerFindById(long id)
{
    return _context.Customer.Find(id);
}

OfferRepository.cs

private readonly IDatabaseContext _context;
// DatabaseContext is injected by AutoFac
public OfferRepository(IDatabaseContext context)
{
     _context = context;
}
public void AddOffer(Offer offer)
{
    // _context.Entry(offer.Customer) --> Detached
    _context.Offers.Add(offer);
}

我真的不明白为什么客户条目是分离的。有人能帮我一下吗?

EF代码第一:为什么实体在找到它后被分离

感谢iagle和SOfanatic。

问题是我的IoC容器(Autofac)的配置。它在每个存储库中注入了一个新的DatabaseContext。因此,我在offerRepository和customerRepository中有两个不同的上下文。

我发现,方法InstancePerLifetimeScope()上的DatabaseContext注册丢失

AutfacConfig.cs

public static void RegisterComponents()
{
    var builder = new ContainerBuilder();
        builder.RegisterType<DatabaseContext>()
            .InstancePerLifetimeScope()
            .As<IDatabaseContext>();
    // further registrations
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}