繁体   English   中英

实体框架附加对象但不调用SaveChanges

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM