2012-05-21 43 views
4

使用实体框架4.3.1 CodeFirst和有没有运气得到迁移或脚本来尊重,我想我的表在最终的模式。实体框架代码优先忽视特定的模式

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

我的数据库管理员告诉我,由于我是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]) 
) 

任何人都有运气让实体框架尊重的架构?这种行为几乎杀死了我们在企业环境中使用codefirst的能力。

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

+0

奇。看起来像TSQL,因此对我来说SQL Server。那是对的吗?我已经完成了很多没有问题的事情。从我的代码第一本书: [表(“地点”,架构=“baga”)] 公开课目的地 请记住,对于Visual Basic –

+2

(感觉不像答案..)你尝试了一些比“dbo “?想知道是否因为“dbo”是EF/SQL Server的默认值,SQL Server提供程序不会显式添加它。 –

+0

Julie - (是,SQL Server)尝试使用除“dbo”以外的内容,并且它创建并指定模式就好!有趣。问题是,我们*想*我们的表在“dbo”有趣的是,它只是*期待*“dbo” –

回答

5

正如我的评论似乎已经回答了这个窘境,我正在重新创建它作为答案。

看起来,因为SQL Server提供程序使用“dbo”作为默认模式,所以即使在您的配置中指定,也不会将“dbo”添加到创建表的TSQL中。

这回答了基本问题。但是现在我好奇dbo是否是默认的,你(Bob)是否仍然有理由指定它?如果你只是想让默认对于阅读代码的人来说是明显的,那么在配置中使用它并没有什么坏处。但是这种行为是否会造成另一种副作用?

添加:Aha!固定在EF5! :)(我刚刚更新了我的测试项目以使用EF5RC(针对.NET 4.0),并且我在TSQL中为create table创建了明确的“dbo”。)

+0

问题是,当我登录到SQL Server时,“dbo”不是我用户的默认模式......但EF似乎假设它是。所以,EF认为是默认模式与我的*真实*默认模式是(域\ bob.bland)之间有一个断开。当EF假设时,它就无法指定表格应该放在“dbo”模式中。那有意义吗? –

+0

哦!现在我明白为什么它有点问题。可能有一个已知的解决方法,但我不知道你是否可以在迁移中指定它? –

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

和下位看起来像这样

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