实体框架6 Create()vs new

时间:2015-07-14 11:59:06

标签: c# entity-framework-6

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

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

VS

MyEntity me = entities.myentities.Create();

我还需要在第二个例子中添加“我”吗?如果是这样,是否有某种优势,无论如何?

非常感谢!

4 个答案:

答案 0 :(得分:14)

MyEntity me = new MyEntity();

将创建MyEntity

的新实例
MyEntity me = entities.myentities.Create();

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

  

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

from here

答案 1 :(得分:5)

是的,你还需要添加它。来自Create方法的documentation

  

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

答案 2 :(得分:1)

MyEntity me = new MyEntity();

等于

MyEntity me = entities.myentities.Create();

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

该行

entities.myentities.Add(me)

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

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

答案 3 :(得分:0)

如果使用实体继承,则可以使用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()