不在旧数据库中的实体框架映射表
问题描述:
我在包含'Note'列的新DB中有表。我有旧的数据库与同一个表具有相同的结构,没有列'注意'。 我改变了EDMX,我从新的数据库添加(映射)列'注'。但如果我想在旧的数据库中使用edmx我有错误:列doest不存在...不在旧数据库中的实体框架映射表
我试图把代码尝试catch,但没有succesfull。错误是在外面尝试捕捉。
//---new version DB
try
{
vehicles = entities.Vehicle.Where(v => v.NumPlate == numPlate || v.Note == numPlate);
}
catch (Exception)
{
vehicles = entities.Vehicle.Where(v => v.NumPlate == numPlate);
}
//---old version DB
foreach (Vehicle vehicle in vehicles) //<------- ERROR
我该如何解决? 谢谢
答
这是一种'黑客',但您可以选择ignore
Note
属性,一旦你使用旧的数据库。
寻找在你的context
类的OnModelCreating
方法,并将其替换:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (this.Database.Connection.Database == "Name_Of_Old_Database")
modelBuilder.Entity<Vehicle>().Ignore(x => x.Note);
}
更新:
由于您使用.edmx
映射和有目前没有办法修改映射在运行时我假设我的建议确实是错误的。
我还是不明白什么是你想使用try/catch
块来实现的,这不要紧,你是否包括(失踪)Note
场查询或不是,因为Entity Framework
实现模型不再与数据库兼容,它将拒绝完全使用这个数据库。
但2点要牢记:
-
由于您使用的
IQueryable
,你try/catch
确实是放错了地方,除了将仅在Materialization
试图真实的检索时,将引发(数据)。可以使用
ToList
方法(等等)物化查询:entities.Vehicle.Where(v => v.NumPlate == numPlate || v.Note == numPlate).ToList()
;或移动
try/catch
块以包装foreach
声明。 您可以使用
System.Data.Entity.Database.CompatibleWithModel()
方法来早期确定(例如在上下文初始化时)您的模型和数据库是否仍然可以一起工作。
为什么不使用版本系统来知道要连接到哪个数据库?通过了解版本,您可以在不同情况下编写不同的查询。 – 2013-05-13 09:15:50
那么,如果我理解的很好,我必须创建新的实体表与新的列和由具体的实体表使用的版本? – Musketyr 2013-05-13 09:30:10
是的,你需要不同的类附加到这些实体。因为我知道EF没有办法通过单个类和实现来支持太多不同的实体表。 – 2013-05-13 09:37:52