C# EF6仅使用实体向集合添加实体';身份证
我有一个问题,我需要在从EF读取实体时将其添加到集合中。 因为集合所属的实体稍后会添加到另一个上下文中 范例 实体事件被创建并保存到EFContext 1并获取ID 1。 事件需要保存在此处,然后添加到集合中 实体车已创建,但未添加或保存到上下文中。 在用户点击一个按钮后,汽车在几个功能之间传递。 Car被传递到另一个类,并在该类中添加到第二个DBContext(2)。 或者可能是用户取消了,汽车没有被保存,事件仍然存在,证明它发生了 汽车拥有一系列事件作为属性。 我想将事件添加到此集合中,但只能使用它的id,因为car稍后由另一个DBContext 2添加和保存 通常,我希望从当前DBContext加载事件,并将该事件添加到car实体中。但随后两个DBContext混合在一起。 我想要的是类似于C# EF6仅使用实体向集合添加实体';身份证,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我有一个问题,我需要在从EF读取实体时将其添加到集合中。 因为集合所属的实体稍后会添加到另一个上下文中 范例 实体事件被创建并保存到EFContext 1并获取ID 1。 事件需要保存在此处,然后添加到集合中 实体车已创建,但未添加或保存到上下文中。 在用户点击一个按钮后,汽车在几个功能之间传递。 Car被传递到另一个类,并在该类中添加到第二个DBContext(2)。 或者可能是用户取消了,汽车没有被保存,事件仍然存在,证明它发生了 汽车拥有一系列事件作为属性。 我想将事件添加到此集合中,但只
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之间的关系是什么样子的(我猜是多对多,但有没有连接类?)。这些类,是的,但也有代码,它们以您希望的方式使用它们,以帮助理解您正在尝试做什么。