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);
}
我真的不明白为什么客户条目是分离的。有人能帮我一下吗?
感谢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));
}