Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# EF6仅使用实体向集合添加实体';身份证_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# EF6仅使用实体向集合添加实体';身份证

C# EF6仅使用实体向集合添加实体';身份证,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我有一个问题,我需要在从EF读取实体时将其添加到集合中。 因为集合所属的实体稍后会添加到另一个上下文中 范例 实体事件被创建并保存到EFContext 1并获取ID 1。 事件需要保存在此处,然后添加到集合中 实体车已创建,但未添加或保存到上下文中。 在用户点击一个按钮后,汽车在几个功能之间传递。 Car被传递到另一个类,并在该类中添加到第二个DBContext(2)。 或者可能是用户取消了,汽车没有被保存,事件仍然存在,证明它发生了 汽车拥有一系列事件作为属性。 我想将事件添加到此集合中,但只

我有一个问题,我需要在从EF读取实体时将其添加到集合中。 因为集合所属的实体稍后会添加到另一个上下文中

范例 实体事件被创建并保存到EFContext 1并获取ID 1。 事件需要保存在此处,然后添加到集合中

实体车已创建,但未添加或保存到上下文中。 在用户点击一个按钮后,汽车在几个功能之间传递。 Car被传递到另一个类,并在该类中添加到第二个DBContext(2)。 或者可能是用户取消了,汽车没有被保存,事件仍然存在,证明它发生了

汽车拥有一系列事件作为属性。 我想将事件添加到此集合中,但只能使用它的id,因为car稍后由另一个DBContext 2添加和保存

通常,我希望从当前DBContext加载事件,并将该事件添加到car实体中。但随后两个DBContext混合在一起。 我想要的是类似于
Car.Events.Add(newevent(){EventId==1})的东西
但这是想创造一个新的事件,这不是我想要的

我无法访问关系表(通过EF),因为它是EF生成的


我想要的是可能的吗?

有一些选项可能适合您的场景,但我建议在使用有界上下文时要谨慎,不要接受在每个引用它们的上下文中加载实体的成本。如果一个DbContext创建了一个事件,而另一个DbContext创建了一个要绑定到该现有事件的汽车,并且知道该事件ID,则可以执行以下操作:

using (var carContext = new CarContext())
{
   var event = new Event { Id = eventId };
   carContext.Events.Attach(event);
   var car = new Car { /* ... */ };
   car.Events.Add(event);

   carContext.SaveChanges();
}
如果第二个上下文更为持久,例如作用域为web请求等,则在附加事件之前,应首先使用该引用搜索事件上下文

Event event = carContext.Events.Local.SingleOrDefault(x => x.Id == eventId);
if (event == null)
{
   event = new Event { Id = eventId };
   carContext.Events.Attach(event);
}
// ...
如果SaveChanges事件未被持久化,或者在调用此代码之前已被删除,则这将在SaveChanges上引发异常

通常,如果我有一个有界的上下文,其中汽车上下文需要了解事件,但只关心读取/关联事件到汽车,并且只需要几列,那么我将简化的事件实体模型映射到只包含我需要的字段的事件,然后我可以在上下文中廉价地加载这些事件。例如,如果事件表有30列,但就Cars而言,我只需要事件的Id、名称和日期时间,那么我的CarContext将只使用这3列映射轻量级事件实体,而不是完整的事件实体定义。这样,我的汽车上下文就可以安全、廉价地加载和关联该事件:

using (var carContext = new CarContext())
{
   var event = carContext.Single(x => x.Id == eventId); // Selects 3 columns from DB or can load from cache for longer-lived contexts. I get an exception here if the Event doesn't exist rather than SaveChanges.
   var car = new Car { /* ... */ };
   car.Events.Add(event);

   carContext.SaveChanges();
}

需要注意的是,这个轻量级事件不能用于创建事件行,除非它拥有所有不可为null的字段,甚至只有一个DbContext应该负责插入任何非平凡实体。我通常在这些实体的名称前面加上轻量级的“Lw”,即“LwEvent”。这些实体有一个注释标题,表示它们不用于插入。

请显示类。现在还不清楚car和event之间的关系是什么样子的(我猜是多对多,但有没有连接类?)。这些类,是的,但也有代码,它们以您希望的方式使用它们,以帮助理解您正在尝试做什么。