【问题标题】:Entity Framework 6 Create() vs new实体框架 6 Create() 与新的
【发布时间】:2015-07-14 11:59:05
【问题描述】:

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

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

MyEntity me = entities.myentities.Create();

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

非常感谢!

【问题讨论】:

标签: c# entity-framework-6


【解决方案1】:
MyEntity me = new MyEntity();

将创建MyEntity 的新实例

MyEntity me = entities.myentities.Create();

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

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

from here

【讨论】:

  • 我希望我不是在说显而易见的,但我有更多的时间玩,我发现 {create} 方法允许我使用导航属性(之后我已经添加了它)而 {new} 方式没有。
  • @Yabbie 生成的代理为您提供了这些好处,并且是创建新实例的更好方法
【解决方案2】:

是的,您仍然需要添加它。来自 Create 方法的documentation

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

【讨论】:

【解决方案3】:
MyEntity me = new MyEntity();

等于

MyEntity me = entities.myentities.Create();

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

线

entities.myentities.Add(me)

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

在第二个示例中,“我”是必需的,因为您将创建一个没有引用来保存对象的对象实例。

【讨论】:

  • 创建的对象仅在非常特殊的情况下是相等的。说他们是平等的是非常具有误导性的,或者可以说是错误的。请参阅accepted answerproxiesCreate method 上的相应官方文档。
【解决方案4】:

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

【讨论】:

  • 这完全没有必要。使用db.Set.BaseClass>().Create<SubClass>()
  • 我的例子是关于运行时条件,而不是编译时间。在这种情况下,您的模板解决方案当然更容易使用:)
  • 演员 (DialDerived) 使其成为编译时条件。
  • 如何将 SubClass 替换为运行时变量?
  • 不是。但是您的代码最终会使用在编译时已知的派生类型,因此您不妨使用泛型类型参数。
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多