实体框架 6 代码首先更改从视图到新表的映射

本文关键字:视图 新表 映射 框架 代码 实体 | 更新日期: 2023-09-27 18:33:00

我正在维护一个 WPF 应用程序,该应用程序使用实体框架代码优先进行迁移(不是自动(。此应用程序中的某些 POCO 映射到视图(指向另一个数据库(。我想用于执行此操作的方法类似于此答案中所做的:如何在代码优先实体框架中使用视图

现在,我希望其中一个 POCO(公司(指向一个表而不是视图。自从指向视图以来,POCO 也发生了一些变化。

当我在 POCO 和 CompanyConfiguration-class 中进行更改(更改 ToTable(((后添加迁移时,迁移似乎认为视图是现有表并尝试重命名它。例如,Up((-方法的开头将如下所示:

    RenameTable(name: "dbo.vCompany", newName: "Company");
    AlterColumn("dbo.Company", "ParentAccount", c => c.String(maxLength: 160));
    AlterColumn("dbo.Company", "Country", c => c.String(maxLength: 100));

但是,我不希望更改视图,我希望从头开始创建与 POCO 匹配的公司表。实现这一目标的正确/好方法是什么?不用自己写 Up(( 和 Down(( 方法,可以吗?

目前,该应用程序使用实体框架 6.1,但是当首次创建此公司/vCompany 映射时,我认为它是版本 4.3。

实体框架 6 代码首先更改从视图到新表的映射

没有太多的信息/帮助来解决这个问题,但我做了以下对我有用的工作(尽管非常繁琐的工作(:

我不得不在迁移中完全重写自动创建的 Up(( 和 Down(( 方法。使用 CreateTable(( 创建表而不是重命名视图。

在 Up(( 方法中:

CreateTable(
            "dbo.Company",
            c => new
            {
                CompanyId = c.Guid(nullable:false),
                ParentAccount = c.String(maxLength:160),
                Country = c.String(maxLength:100),
                Address1_City = c.String(maxLength:4000),
                Address1_Country = c.String(maxLength: 4000),
                Address1_Line1 = c.String(maxLength: 4000),
                Address1_Line2 = c.String(maxLength: 4000),
                Address1_PostalCode = c.String(maxLength:50),
                Owner = c.String(maxLength:160),
                OwnerId = c.Guid(nullable:false),
                Name = c.String(maxLength:160),
                EMailAddress = c.String(maxLength:100),
                InvoiceEMailAddress = c.String(maxLength:100),
                Fax = c.String(maxLength:50),
                CreditLimit = c.Decimal(storeType:"money"),
                CreditOnHold = c.Boolean(nullable:false, defaultValue:false),
                IsPrivate = c.Boolean(nullable:false, defaultValue:false),
                StatusCode = c.Int(),
                CustomerTypeCode = c.Int(),
                BEGreenCreditLimit = c.Int(),
                IssuingBodyAccount = c.String(maxLength:20),
                CustomerType = c.String(maxLength:100),
                IsElProducer = c.Boolean(nullable:false, defaultValue:false),
                IsEnergyTrader = c.Boolean(nullable:false,defaultValue:false),
                VATNumber = c.String(maxLength:100),
                ContactPerson = c.String(maxLength:160),
                ContactPersonPhone = c.String(maxLength:50),
                ContactPersonFax = c.String(maxLength:50),
                ContactPersonEmail = c.String(maxLength:100)
            }
            )
            .PrimaryKey(p=>p.CompanyId)
            ;

从另一个数据库中提取的公司值引用某些列的长 maxLength。