【问题标题】:Entity Framework Code First ignoring specific schema实体框架代码优先忽略特定模式
【发布时间】:2012-05-21 14:51:16
【问题描述】:

使用 Entity Framework 4.3.1 CodeFirst 并且没有运气让迁移或脚本尊重我希望我的表最终所在的架构。

似乎默认行为(无论我做什么,我都会看到)是从实际运行的 SQL 中完全省略架构,导致在默认架构中为运行迁移的用户创建表,或者脚本。

我的 DBA 告诉我,他们无法更改我的默认架构,因为我是 AD 组的一部分而不是本地用户,因此更改运行用户的默认架构(通常推荐的解决方法)脚本根本不是一个选项。

我尝试过使用这样的注释:

[Table("MyTable", Schema = "dbo")]
public class MyTable
{
    public int Id { get; set; }

    public string MyProp1 { get; set; }

    public string MyProp2 { get; set; }
}

我也尝试过使用同一事物的 fluent 变体:

modelBuilder.Entity<YourType>().ToTable("MyTable", "dbo");

生成的脚本(和迁移)忽略了我尝试指定架构的事实。脚本如下所示:

CREATE TABLE [MyTable] (
    [Id] [int] NOT NULL IDENTITY,
    [MyProp1] [nvarchar](max),
    [MyProp2] [nvarchar](max),
    CONSTRAINT [PK_MyTable] PRIMARY KEY ([Id])
)

当那里应该像这样藏在里面的 [dbo]:

CREATE TABLE [dbo].[MyTable] (
    [Id] [int] NOT NULL IDENTITY,
    [MyProp1] [nvarchar](max),
    [MyProp2] [nvarchar](max),
    CONSTRAINT [PK_MyTable] PRIMARY KEY ([Id])
)

有没有其他人幸运地让实体框架尊重架构?这种行为几乎扼杀了我们在企业环境中使用代码优先的能力。

提醒:将我的用户更改为具有不同的默认架构根本不是一种选择。

【问题讨论】:

  • 奇数。看起来像 TSQL,因此对我来说像 SQL Server。那是对的吗?我已经做了很多,没有任何问题。从我的代码第一本书中: [Table("Locations", Schema="baga")] public class Destination 请记住对于 Visual Basic
  • (感觉不像是答案..)您尝试过“dbo”以外的其他方法吗?想知道是否因为“dbo”是 EF/SQL Server 的默认设置,SQL Server 提供程序不会费心显式添加它。
  • Julie - (是的,SQL Server)尝试使用“dbo”以外的东西,它创建并指定架构就好了!有趣的。问题是,我们想要我们的表在“dbo”中有趣的是它只是期望“dbo”

标签: entity-framework entity-framework-4 ef-code-first


【解决方案1】:

由于我的评论似乎已经回答了这个难题,我正在重新创建它作为答案。

似乎因为 SQL Server 提供程序使用“dbo”作为默认架构,即使您在配置中指定了“dbo”,它也不会显式将“dbo”添加到创建表的 TSQL。

这回答了基本问题。但是现在我很好奇 dbo 是否是默认值,你(Bob)还有理由指定它吗?如果您只是希望默认值对阅读代码的人来说是显而易见的,那么在配置中使用它并没有什么坏处。但是这种行为会产生另一个副作用吗?

补充:啊哈!已在 EF5 中修复! :) (我刚刚更新了我的测试项目以使用 EF5RC(针对 .NET 4.0),并且我在 TSQL 中明确获得了“dbo”来创建表。)

【讨论】:

  • 问题是当我登录到 SQL Server 时,“dbo”不是我的用户的默认架构......但 EF 似乎假设它是。因此,EF 假定的默认架构与我的 real 默认架构(域\bob.bland)之间存在脱节。当 EF 假设时,无法指定表应该进入“dbo”模式。这有意义吗?
  • 哦!现在我明白为什么它有点问题了。可能有一个已知的解决方法,但我想知道您是否可以在迁移中指定它?
【解决方案2】:

我尝试了 Bob Bland 尝试的所有方法,但都没有成功(我也在使用 Entity Framework 4.3.1 CodeFirst)。然后我将生成的迁移更改为如下所示,并且它起作用了。也许这会为某人节省几分钟的痛苦?

所以我的解决方案是正常生成迁移,然后手动修改它以包含dbo.,如下所示。

    public override void Up()
    {
        CreateTable(
            "dbo.UploadedFiles", // See? I have added dbo. to the front of my table name :-)
            c => new
                {
                    UploadedFileId = c.Guid(nullable: false, identity: true),
                    // other columns omitted for brevity...
                    FileData = c.Binary(),
                })
            .PrimaryKey(t => t.UploadedFileId);
    }

向下位看起来像这样

   public override void Down()
    {
        DropTable("dbo.UploadedFiles"); // See? I have added dbo. to the front of my table name here too :-)
    }

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2015-08-19
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多