Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架映射列不在旧数据库中_C#_Sql_Entity Framework_Mapping - Fatal编程技术网

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

C# 实体框架映射列不在旧数据库中,c#,sql,entity-framework,mapping,C#,Sql,Entity Framework,Mapping,我有一个新数据库中的表,其中包含“Note”列。我有一个旧数据库,它具有相同的表和相同的结构,没有“Note”列。 我更改了edmx,从新数据库中添加(映射)列“Note”。但如果我想在旧数据库中使用edmx,我有一个错误:列不存在 我试着用代码来捕捉,但没有成功。错误在“尝试捕捉”之外 //---new version DB try { vehicles = entities.Vehicle

我有一个新数据库中的表,其中包含“Note”列。我有一个旧数据库,它具有相同的表和相同的结构,没有“Note”列。 我更改了edmx,从新数据库中添加(映射)列“Note”。但如果我想在旧数据库中使用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
/---新版本数据库
尝试
{
车辆=实体.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请参阅