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

Mus*_*tyr 4 c# sql mapping entity-framework

我在新数据库中有表,其中包含"注释"列.我有旧DB与相同的表,具有相同的结构,没有列'注意'.我更改了edmx,我从新数据库添加(映射)列'Note'.但如果我想在旧DB中使用edmx我有错误:列doest不存在...

我尝试将代码放入尝试catch,但没有成功.错误是在try try之外.

//---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
Run Code Online (Sandbox Code Playgroud)

我怎么解决?谢谢

hai*_*770 5

这是一种在"黑客"的,但你可以选择ignoreNote,一旦你正在使用的旧的数据库属性.

OnModelCreatingcontext类中查找方法,并替换为:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (this.Database.Connection.Database == "Name_Of_Old_Database")
            modelBuilder.Entity<Vehicle>().Ignore(x => x.Note);
    }
Run Code Online (Sandbox Code Playgroud)

更新:

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