2016-03-10 127 views
0

我试图创建与代码优先EF6.1项目之前访问数据库。所有工作正常我已经启用迁移,创建和更新数据库的作品了。现在我的问题: 我已经创建了一个表“VersionHistory”和一个CompanyInfo表。EF6代码优先:更新数据库

我写的“升级WIZZARD”为更新数据库。在开始数据库更新之前,是否可以从这些表中获取数据以显示信息(例如YourCompanyName和从程序版本1.x更新为1.y)?

我应该使用经典的SQLConnection这个?

非常感谢

+0

为什么不把这个信息来配置文件? –

+0

它是一个多用户环境,一个用户/管理员有权升级数据库并推出新的程序文件。 – FaceOfIngo

+0

为什么不使用EF?如果你想保留它的DbSets - 使用存储过程或视图。 –

回答

0

您可以使用SQL连接(也可以是同英法),或者你可以禁用EF数据库结构检查。

System.Data.Entity.Database.SetInitializer<MyModel>(null); 

编辑

如果您访问未更新的数据库上的实体,您可以从EF接收阿土异常(即缺少列,缺少表等)。

+0

这个我已经在我的AppContext中用ctor试过了,之后使用了与之前相同的异常: – FaceOfIngo

+0

这个我已经在我的AppContext中用ctor试过了,之前用过相同的异常: in ctor <! - language: c# - > System.Data.Entity.Database.SetInitializer (null); 使用(VAR CTX =新AppContext()){ \t变种版本= ctx.Versions.LastOrDefault() - >异常 } 例外: 无效的列名称服务器名'。 无效的列名称'ConnectionType'。 列名称'IntegratedSecurity'无效。 – FaceOfIngo

+0

这个例外似乎与模型没有关系。它似乎与表中的一些缺失的列有关。如果您没有检查模型并且模型不是最新的,那么当您访问未更新的模型部分时可能会出现此异常。我也更新了答案。 – bubi

0

在符合“布比”我将使用基于我的上下文例如将SQLConnection

using (var ctx = new AppContext()) { 
ctx.Database.Connection.Open(); 

var cmd = ctx.Database.Connection.CreateCommand(); 
cmd.CommandText = "Select * From CompanyInfo"; 

var rdr = cmd.ExecuteReader(); 
var infos = (from row in rdr.Cast<System.Data.Common.DbDataRecord>() 

      let entityId = (int)row["EntityId"] //internal key 
      let entityKey = (string)row["EntityKey"] //visible key 
      let displayname = (string)row["DisplayName"] //company name 

      // some more stuff (version, etc.) 

      select new NOCompanyInfo { 
       EntityId = entityId, 
       EntityKey = entityKey, 
       DisplayName = displayname, 
       DBName = dbName, 
       ... 
      }).ToList(); 

return new ObservableCollection<NOCompanyInfo>(infos); 

}

感谢

相关问题