Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF代码优先:为什么实体在找到后被分离?_C#_Ef Code First_Entity Framework 6 - Fatal编程技术网

C# EF代码优先:为什么实体在找到后被分离?

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

我正在开发一个小型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中,每个应用程序生命周期只有一个上下文是非常糟糕的。这可能会导致许多错误。应该是每次通话。每个呼叫都必须与其他呼叫隔离。然后,您将需要自己附加实体,但这是完全好的。