C# EF代码优先:为什么实体在找到后被分离?
我正在开发一个小型web应用程序,我决定首先使用EntityFramework(v6.1.x)代码。 我想创建一个新的数据库条目-一个“offer”。在“Offer”类中,还存储了Offer所属的“Customer” 好吧,没什么特别的,我想。。。 在创建新的报价之前,我从数据库中检索客户。 我创建新的报价并设置客户属性。在上下文中调用SaveChanges之后,我在客户数据库中复制了客户。在进行了一些调试之后,我发现客户实体已分离EntryState。。。为什么? 以下是一些代码片段: MVC控制器C# EF代码优先:为什么实体在找到后被分离?,c#,ef-code-first,entity-framework-6,C#,Ef Code First,Entity Framework 6,我正在开发一个小型web应用程序,我决定首先使用EntityFramework(v6.1.x)代码。 我想创建一个新的数据库条目-一个“offer”。在“Offer”类中,还存储了Offer所属的“Customer” 好吧,没什么特别的,我想。。。 在创建新的报价之前,我从数据库中检索客户。 我创建新的报价并设置客户属性。在上下文中调用SaveChanges之后,我在客户数据库中复制了客户。在进行了一些调试之后,我发现客户实体已分离EntryState。。。为什么? 以下是一些代码片段: 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();
Customer 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);
}
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);
}
offerepositional.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);
}
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);
}
我真的不明白为什么客户条目是分离的。
有人能帮我吗?谢谢艾格尔和索法纳蒂克 问题是我的IoC容器(Autofac)的配置。它在每个存储库中注入了一个新的DatabaseContext。因此,我在OfferPresository和CustomerPresository中有两个不同的上下文 我发现DatabaseContext注册上的InstancePerLifetimeScope()方法丢失了 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));
}
公共静态无效注册表组件()
{
var builder=new ContainerBuilder();
builder.RegisterType()
.InstancePerLifetimeScope()实例
.As();
//进一步登记
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
}
谢谢艾格尔和索法纳蒂克
问题是我的IoC容器(Autofac)的配置。它在每个存储库中注入了一个新的DatabaseContext。因此,我在OfferPresository和CustomerPresository中有两个不同的上下文
我发现DatabaseContext注册上的InstancePerLifetimeScope()方法丢失了
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));
}
公共静态无效注册表组件()
{
var builder=new ContainerBuilder();
builder.RegisterType()
.InstancePerLifetimeScope()实例
.As();
//进一步登记
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
}
是否将IDatabaseContext
作为单例注入?如果不是,则注入两个不同的上下文,当然不会附加另一个上下文中的实体。我猜Customer
和Offer
来自两个不同的上下文。IDatabaseContext
是否作为一个单独的上下文注入?如果不是,则会注入两个不同的上下文,当然不会附加来自另一个上下文的实体。我猜Customer
和Offer
来自两个不同的上下文。这将解决您的问题,但在IMO中,每个应用程序生命周期只有一个上下文是非常糟糕的。这可能会导致许多错误。应该是每次通话。每个呼叫都必须与其他呼叫隔离。然后您需要自己附加实体,但这完全没问题。它可以解决您的问题,但在IMO中,每个应用程序生命周期只有一个上下文是非常糟糕的。这可能会导致许多错误。应该是每次通话。每个呼叫都必须与其他呼叫隔离。然后,您将需要自己附加实体,但这是完全好的。