实体框架6 Create()与new

本文关键字:new Create 框架 实体 | 更新日期: 2023-09-27 18:02:47

以这两种方式添加实体有什么区别?

MyEntity me = new MyEntity();
entities.myentities.Add(me);

MyEntity me = entities.myentities.Create();

我还需要在第二个例子中加上"我"吗?如果是这样,是否有某种优势?

非常感谢!

实体框架6 Create()与new

MyEntity me = new MyEntity();

将创建MyEntity 的新实例

MyEntity me = entities.myentities.Create();

将创建MyEntity的代理封装实例(假设您的上下文配置为创建代理(

该代理覆盖实体的一些虚拟属性,以插入钩子,以便在访问该属性时自动执行操作。例如,此机制用于支持关系的延迟加载。

从这里

是的,您仍然需要添加它

为该集合的类型创建实体的新实例。请注意,此实例未添加或附加到集合中。

MyEntity me = new MyEntity();

等于

MyEntity me = entities.myentities.Create();

以上两项都创建了MyEntity的新实例,但都没有将其附加到由myentities表示的DbSet。

线路

entities.myentities.Add(me)

将实例附加到DbSet,不过也可以使用Attach(me)

在第二个例子中,"me"是必需的,因为您将创建一个对象实例,而没有保存该对象的引用。

如果您使用实体继承,您可以使用Create((方法实现良好的多态性行为,因为它总是实例化正确的实体(而不是泛型实体(。示例:

public DbSet GetDialDbSet(DialEnum type)
    {
        DbSet ret;
        switch (type)
        {
            default:
            case DialEnum.MAPPING_REASON:
                ret = DialMappingReasons; 
                break;
            case DialEnum.PROCESSING_INFORMATION:
                ret = DialProcessingInformation;
                break;
        }
        return ret;
    }

和多态性使用:

 DialDerived entity = (DialDerived) Db.GetDialDbSet(type).Create()