[英]InvalidOperationException when calling SaveChanges in .NET Entity framework
[英]Entity Framework Attaching an object but not calling SaveChanges
下面是一个示例代码,该代码应演示我正在尝试实现的目标:
public static void addRecord(CargoShip ship, DbContext db)
{
// Realistically, in my application this is decided by business logic, - omitted for brevity
long containerTypeIDNewContainer = 5;
Container containerToAdd = new Container()
{
cargoShipBelongingToID = ship.cargoShipID,
containerTypeID = containerTypeIDNewContainer
};
ship.Containers.Add(containerToAdd);
// This line of code is what I want to be able to do
// WITHOUT doing a db.SaveChanges
// ContainerType is a lookup table in the database, each container type has pre-defined
// Height/Width etc
// This throws a null exception, ContainerType object does not exist.
string containerHeight = containerToAdd.ContainerType.Height;
}
我基本上希望能够创建一个新的Container
并在该对象上填充外键,并能够将外键的子级作为代码中的对象进行访问。
如果我调用SaveChanges,它自然会去并获取Container对象的值,但是我想填写这些值/对象而不必执行Savechanges。
编辑:
万一不清楚,忘了提。 关系是: CargoShip
有许多Container
,一个Container
有一个ContainerType
,这是FK,并且不能为空。
你能帮忙吗
谢谢
EF 不会仅仅因为您在实体中设置ID而为您填写所有FK属性。 这些属性仅在调用SaveChanges
之后设置。
因此,除非您确实打算在某个时候调用SaveChanges
,否则调用Add
并没有多大意义。
如果您只是想获取适当的ContainerType
,那么还可以执行Select
(或Find
)操作-最终可以归结为EF必须在幕后使用的几乎相同的SQL查询:
var containerType = db.ContainerTypes.Find(containerTypeIdNewContainer);
请注意,如果特定的containerType
记录在本地缓存中尚不存在,则Find
方法将仅转到DB。 但是,本地缓存的生存期与DbContext
的生存期DbContext
,因此可能很短。
如果它们相对稳定,那么维护自己的常用实体缓存可能是有意义的:
var containerTypes = db.ContainerTypes.ToDictionary(x => x.Id, x => x);
...
var containerType = containerTypes[containerTypeIdNewContainer];
假设您可以访问DbContext(不熟悉EntityFrameworkConnection类),则可以简单地使用IQueryable。
IQueryable<T> query = db.Set<ContainerType>()
var containerType = query.FirstOrDefault(x => x.containerTypeID == containerTypeIDNewContainer)
string containerHeight = containerType.Height;
希望我能正确理解你的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.