这里有初学者问题。鉴于以下内容:
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)
之类的操作会怎样?哪一个被使用,为什么?
答案 0 :(得分: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)当你需要这个默认实例时,只需按照上面定义的标准从数据库中查询它。