C# 实体框架6 Create()与new

C# 实体框架6 Create()与new,c#,entity-framework-6,C#,Entity Framework 6,以这两种方式添加实体之间有什么区别 MyEntity me = new MyEntity(); entities.myentities.Add(me); vs 我还需要在第二个示例中添加“我”吗?如果是这样的话,是否有某种优势,一种或另一种 非常感谢 是的,您仍然需要添加它。从创建方法的 为此集合的类型创建实体的新实例。请注意,此实例未添加或附着到集合 等于 MyEntity me = entities.myentities.Create(); 以上两种方法都会创建MyEntity的新实例,

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

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

我还需要在第二个示例中添加“我”吗?如果是这样的话,是否有某种优势,一种或另一种


非常感谢

是的,您仍然需要添加它。从创建方法的

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

等于

MyEntity me = entities.myentities.Create();
以上两种方法都会创建MyEntity的新实例,但都不会将其附加到MyEntity表示的数据库集

线路

entities.myentities.Add(me)
将实例附加到DbSet,但也可以使用
Attach(me)

第二个示例中需要“me”,因为您将创建一个对象实例,而不需要引用来保存该对象

MyEntity me = new MyEntity();
将创建MyEntity的新实例

MyEntity me = entities.myentities.Create();
将创建MyEntity的代理包装实例(假设您的上下文配置为创建代理)

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


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

和多态性用法:

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

有一个我希望我不是说显而易见的,但我有更多的时间来玩转,我发现,{create}方法允许我使用导航属性(在我添加它之后),而{new}方法不需要。@Yabbie生成的代理为您提供了这些好处,并且是创建新实例的更好方法。这根本没有必要。使用
db.Set.BaseClass>().Create()
。我的示例是关于运行时条件,而不是编译时。在这种情况下,您的模板解决方案当然更易于使用:)强制转换
(DialDerived)
使其成为编译时条件。如何将子类替换为运行时变量?不是。但您的代码最终会使用编译时已知的派生类型,所以您最好使用泛型类型参数。链接已断开。实际链接:向你致敬!您已经设法在一篇文章中找到了一个断开的链接,该链接是由一个爱好是查找的人在整个堆栈交换网络上找到的。创建的对象仅在非常特定的情况下是相等的。声称他们是平等的是非常误导的,或者可以说是错误的。请参见或上的和相应的官方文件。
MyEntity me = entities.myentities.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()