2012-05-21 51 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 :-) 
    }