C# 实体框架映射列不在旧数据库中
我有一个新数据库中的表,其中包含“Note”列。我有一个旧数据库,它具有相同的表和相同的结构,没有“Note”列。 我更改了edmx,从新数据库中添加(映射)列“Note”。但如果我想在旧数据库中使用edmx,我有一个错误:列不存在 我试着用代码来捕捉,但没有成功。错误在“尝试捕捉”之外C# 实体框架映射列不在旧数据库中,c#,sql,entity-framework,mapping,C#,Sql,Entity Framework,Mapping,我有一个新数据库中的表,其中包含“Note”列。我有一个旧数据库,它具有相同的表和相同的结构,没有“Note”列。 我更改了edmx,从新数据库中添加(映射)列“Note”。但如果我想在旧数据库中使用edmx,我有一个错误:列不存在 我试着用代码来捕捉,但没有成功。错误在“尝试捕捉”之外 //---new version DB try { vehicles = entities.Vehicle
//---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
/---新版本数据库
尝试
{
车辆=实体.Vehicle.Where(v=>v.NumPlate==NumPlate | | v.Note==NumPlate);
}
捕获(例外)
{
车辆=实体.Vehicle.Where(v=>v.NumPlate==NumPlate);
}
//---旧版本数据库
foreach(车辆中的车辆)/这是一种“黑客行为”,但在使用旧数据库后,您可以选择忽略Note
属性
在上下文
类中查找OnModelCreating
方法,并替换为:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (this.Database.Connection.Database == "Name_Of_Old_Database")
modelBuilder.Entity<Vehicle>().Ignore(x => x.Note);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
if(this.Database.Connection.Database==“旧数据库的名称”)
modelBuilder.Entity().Ignore(x=>x.Note);
}
更新:
由于您正在使用.edmx
进行映射,并且当前无法在运行时修改映射,因此我认为我的建议确实是错误的
我仍然不明白您试图通过使用try/catch
块实现什么,无论您是否在查询中包含(缺少的)Note
字段,因为Entity Framework
意识到模型不再与数据库兼容,它将完全拒绝使用此数据库
但要记住两点:
- 由于您使用的是
IQueryable
,因此您的try/catch
确实位于错误的位置,只有在物化过程中才会引发异常(在尝试实际检索数据时)
您可以使用ToList
方法具体化查询(除其他方法外):
实体.Vehicle.Where(v=>v.NumPlate==NumPlate | | v.Note==NumPlate).ToList()
或者移动try/catch
块来包装foreach
语句
- 您可以使用
System.Data.Entity.Database.CompatibleWithModel()
方法提前确定(例如在上下文初始化时)您的模型和数据库是否仍然可以一起工作
为什么不使用版本系统来了解连接到哪个数据库?通过了解版本,您可以在不同情况下编写不同的查询。因此,如果我理解得很好,我必须用新列创建新的实体表,并使用具体实体表的版本?是的,您还需要将不同的类附加到这些实体。因为我知道EF不可能通过单个类和实现支持太多不同的实体表。实际上这很好,但数据库标题是相同的。我在数据库中保存了一个值,该值表示数据库的版本。所以我认为可以修改以获得版本值,然后使用hack。您可以尝试使用this.Database.Connection
公开的任何内容来区分数据库。两者之间的连接参数必须有所不同(如果不是数据库名称,则可能是主机)。连接可能非常不同,这取决于客户计算机上的安装-因此我无法使用此属性。我尝试使用,但OnModelCreating不适用于EDMX请参阅