2013-11-04 52 views
0

初学者问题在这里。鉴于以下内容:EF代码中的静态对象和种子数据 - 首先

 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)的事情呢?哪一个被使用,为什么?

回答

2

是它假定这些值的对象在数据库中

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

我通过

Seed方法查询将努力让Tenant,这Name等于"Www"时感到困惑的是哪个版本被使用。 如果在数据库中找到这样的记录,EF将实现新的Tenant对象并通过数据库中的值填充其属性。从CLR的角度来看,Tenant.Www和那个新物化对象将是不同的对象。换句话说,

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

哪一个被使用,为什么?

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

UPDATE

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

+0

谢谢丹尼斯。如果我只是为了快捷方式而试图使用静态类,那么定义只有TenantId定义的Tenant实例是否安全,因此我总是可以通过Tenant分配关系.Www.TenantId?或者你会建议总是执行FirstOrDefault查询以确保安全吗? – SB2055

+0

请在您的问题背景下定义“安全”。你想要什么这个静态实例? – Dennis

+0

使用我的id定义的方法,我应该害怕分配空的或陈旧的Tenant对象,因为我应该执行像push(Tenant.Www)或Add(Tenant.Www)这样的操作。例如:假设静态Tenant.Www只定义了一个Id,并且在Add()操作中使用它,是否会创建另一个Tenant,因为EF无法找到完全匹配?或者是否会使用匹配Id的Seed()的Tenant,因为EF只关心PK? – SB2055