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)
我怎么解决?谢谢
这是一种在"黑客"的,但你可以选择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);
}
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()方法来早期确定(例如,在上下文初始化时)您的模型和数据库是否仍然可以一起工作.
| 归档时间: |
|
| 查看次数: |
3530 次 |
| 最近记录: |