5

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

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

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

4

2 回答 2

5

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

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

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

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

于 2012-05-22T16:59:24.980 回答
0

I tried all of the stuff that Bob Bland tried with a similar lack of success (I was also using Entity Framework 4.3.1 CodeFirst). Then I changed the generated migration to look like this and it worked. Maybe this will save somebody a few minutes of pain?

So my solution was to generate the migration as normal, then hack it by hand to include dbo. as shown below.

    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);
    }

and the Down bit looks like this

   public override void Down()
    {
        DropTable("dbo.UploadedFiles"); // See? I have added dbo. to the front of my table name here too :-)
    }
于 2012-07-02T15:18:24.843 回答