实体框架代码首先忽略特定的模式

时间:2012-05-21 14:51:17

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

使用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; }
}

我也尝试过使用相同内容的流畅变体:

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])
)

有没有其他人有幸让Entity Framework尊重架构?这种行为几乎完全破坏了我们在企业环境中使用codefirst的能力。

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

2 个答案:

答案 0 :(得分:5)

由于我的评论似乎回答了窘境,我正在重新创建它作为答案。

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

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

增加:啊哈!固定在EF5! :)(我刚刚更新了我的测试项目以使用EF5RC(针对.NET 4.0),我在TSQL for create table中明确地获得了“dbo”。)

答案 1 :(得分:0)

我尝试了所有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);
    }

并且Down位看起来像这样

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