EF Code-First中的静态对象和种子数据

时间:2013-11-04 19:09:03

标签: c# asp.net entity-framework

这里有初学者问题。鉴于以下内容:

        public static Tenant Www = new Tenant() { TenantId = 1, Name = "www", Urls = new string[]{"https://app.com"}};

我引用了一个定义了参数的对象。在这种情况下,是否假设具有这些值的对象存在于数据库中?

我的种子方法包含以下内容:

 if (context.Tenants.FirstOrDefault(s => s.Name == "Www") == null) {
            context.Tenants.Add(new Tenant() {
                TenantId = 1,
                Name = "Www",
                Urls = new string[]{"https://app.com", "http://localhost"}
            });
        } 

请注意,我的种子方法中的租户包含额外的Url。我对通过Tenant.Www查询时使用的版本感到困惑。

如果我通过类似obj.TenantId = Tenant.Www.TenantId之类的东西使用静态方法,那么我只会使用Id,但如果我执行obj.Tenants.push(Tenant.Www)之类的操作会怎样?哪一个被使用,为什么?

1 个答案:

答案 0 :(得分:2)

  

假设数据库中存在具有这些值的对象

不,它只是Tenant类的一个实例。在给定的代码行中没有关于此对象的持久性。

  

我对通过

查询时使用的版本感到困惑

您的Seed方法会尝试获取TenantName等于"Www"。 如果在数据库中找到此类记录,则EF将实现新的Tenant对象,并通过数据库中的值填充其属性。从CLR的角度来看,Tenant.Www和新物化的对象将是不同的对象。换句话说,

context.Tenants.FirstOrDefault(s => s.Name == "Www") != Tenant.Www
  

使用哪一个,为什么?

再次,obj != Tenant.Www
EF中没有魔力。当您调用实体类型的构造函数时,您只需创建新对象。 EF上下文对您的对象一无所知,直到您通过Add / Attach方法告知它们。

<强>更新

如果您想要一些默认的Tenant实例,那么: 1)扔掉你的静态实例; 2)定义搜索默认实例的标准(例如,Name == "Www"); 3)当你需要这个默认实例时,只需按照上面定义的标准从数据库中查询它。