【问题标题】:How do I get the Entity Framework to initialise collections on my newly-created entities?如何让实体框架初始化我新创建的实体上的集合?
【发布时间】:2011-08-24 08:18:23
【问题描述】:

我正在尝试使用IDatabaseIntialiser 为我的数据库添加一些测试数据,如下所示:

protected override void Seed(BlogDataContext context)
{
    // <snip>
    var post = context.Posts.Create();
    post.Title = "My Life On Twitter";
    // <snip properties>

    // Set tags
    post.Tags.Add(aspnetTag); // NullRefException
    post.Tags.Add(razorTag);

帖子实体如下所示:

public class Post
{
    // ...
    public virtual ICollection<Tag> Tags { get; set; }

Bitbucket 上的完整实体:PostTag。所有代码都在http://code.dantup.com/blog

但是,post.Tags 为空,所以这不起作用。本来我是用new Post()创建帖子的,但是由于我调用的是EF提供的Create方法,为什么集合没有初始化?

在这里实例化我自己的集合感觉很笨拙,如果我在构造函数中这样做,大概每次我从 EF 加载实体时,它都会在构造函数中创建集合,然后用包含实际的集合覆盖它数据库中的数据?

有没有办法告诉 EF 为我创建一个实体,包括我的 ICollections 的集合/代理(假设 ICollection 是正确的选择)?

编辑context.Configuration.ProxyCreationEnabled 设置为 true(默认),which seems to exist for this reason?

【问题讨论】:

标签: .net asp.net-mvc entity-framework sql-server-ce ef-code-first


【解决方案1】:

使用 POCO 实体和 EF,我通常在构造函数中初始化集合。而且,我更喜欢 ISet 而不是 ICollection ;-)

【讨论】:

  • 你把它初始化成什么?感觉很笨拙,因为 EF 在加载时会以不同的方式初始化事物(可能使用代理)。我想知道是否可以使它相同。另外 - ISet vs ICollection - 我一直在谷歌搜索,但找不到任何信息,哪些集合最适合 EF 以及出于什么原因:(
  • 如果我使用 ISet,我将实例化 HasSet。我认为 EF 很聪明,可以在尝试将集合与您的实体绑定时检查集合是否已初始化。集合确保其集合中的每个项目都是唯一的。集合允许多次引用同一个对象。
  • 如果您从 DbContext 中提取 ICollection 后查看原始视图,您可以看到 EF 将使用 HashSet 来初始化您的对象。我建议在你的属性获取/设置中做同样的事情。也就是说——我同意这并不令人满意。 MVC 为您创建对象,因此您必须使用特定于 EF 的初始化来混淆您的模型代码。我更希望这种行为是通过属性控制的。但是 - 如果您使用 new() 来实例化您的对象,那么在您将它们放入 ObjectContext 之前,EF 无法知道它们。
猜你喜欢
  • 1970-01-01
  • 2018-03-07
  • 2014-01-29
  • 1970-01-01
  • 2023-03-18
  • 2010-09-29
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多