不在旧数据库中的实体框架映射表

问题描述:

我在包含'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 

我该如何解决? 谢谢

+0

为什么不使用版本系统来知道要连接到哪个数据库?通过了解版本,您可以在不同情况下编写不同的查询。 – 2013-05-13 09:15:50

+0

那么,如果我理解的很好,我必须创建新的实体表与新的列和由具体的实体表使用的版本? – Musketyr 2013-05-13 09:30:10

+0

是的,你需要不同的类附加到这些实体。因为我知道EF没有办法通过单个类和实现来支持太多不同的实体表。 – 2013-05-13 09:37:52

这是一种'黑客',但您可以选择ignoreNote属性,一旦你使用旧的数据库。

寻找在你的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()方法来早期确定(例如在上下文初始化时)您的模型和数据库是否仍然可以一起工作。

+0

虽然这很好,但数据库标题是一样的。我有一个值保存在数据库当前版本的数据库中。所以我认为可以修改以获得版本的价值,然后使用黑客。 – Musketyr 2013-05-13 11:53:39

+0

您可以尝试使用'this.Database.Connection'公开的任何内容区分数据库。在两者之间的连接参数中必定有不同的东西(如果不是数据库名称,那么可能是主机)。 – haim770 2013-05-13 12:28:59

+0

连接可能非常不同,它取决于客户计算机上的安装 - 因此我无法使用此属性。 – Musketyr 2013-05-14 04:54:28