5

我在一个包含“注意”列的新数据库中有一个表。我有旧数据库,它具有相同结构的相同表,但没有“注意”列。我更改了 edmx,从新数据库中添加(映射)列“注释”。但是如果我想在旧数据库中使用 edmx 我有错误:列不存在......

我尝试将代码尝试捕获,但没有成功。错误在尝试捕获之外。

//---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

我该如何解决?谢谢

4

1 回答 1

6

这是一种“黑客”,但是一旦您使用旧数据库,您就可以选择ignore该属性。Note

在您的类中查找该OnModelCreating方法context,并替换为:

    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意识到模型不再与数据库兼容,它会完全拒绝使用这个数据库。

但要记住两点:

  • 由于您使用的是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-13T11:13:56.847 回答