EF Code First:为什么实体在找到后会分离?

时间:2015-09-22 13:08:30

标签: c# ef-code-first entity-framework-6

我正在开发一个小型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);
}

老实说,我无法理解客户入境的原因。 有人可以帮帮我吗?

1 个答案:

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