我正在开发一个小型Web应用程序,我决定使用Entity Framework(v6.1.x)Code First。 我想创建一个新的数据库条目 - " offer"。关于"优惠"上课"客户"还存储了要约所属的人。
好吧,没什么特别的,我想...... 在创建新商品之前,我从数据库中检索客户。 我创建了新的商品并设置了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();
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);
}
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);
}
老实说,我无法理解客户入境的原因。 有人可以帮帮我吗?
答案 0 :(得分:0)
感谢ieaglle和SOfanatic。
问题是我的IoC容器(Autofac)的配置。它在每个Repository中注入了一个新的DatabaseContext。因此,我在offerRepository和customerRepository中有两个不同的上下文。
我发现,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));
}