0

初学者问题在这里。鉴于以下情况:

        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"}
            });
        } 

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

如果我通过类似的方式使用静态方法obj.TenantId = Tenant.Www.TenantId,我会发现只使用了 Id,但是如果我做类似的事情obj.Tenants.push(Tenant.Www)呢?使用哪一个,为什么?

4

1 回答 1

2

是否假定具有这些值的对象存在于数据库中

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

我对通过查询时使用哪个版本感到困惑

您的Seed方法将尝试获取Tenant,这Name等于"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) 当您需要这个默认实例时,只需按照上面定义的条件从数据库中查询它。

于 2013-11-04T19:21:31.720 回答