2013-08-16 36 views
11

我正在玩EF 5和代碼第一。到目前爲止,我真的很喜歡它,但我已經注意到它將字符串列默認爲nvarchar。如果我想使用varchar,那麼我必須明確告訴它。實體框架5代碼首先映射字符串到全局varchar

我可以強制它使用VARCHAR而不是NVARCHAR字符串如下:

public class Member 
{ 
    public int id { get; set; } 

    [MaxLength(255), Required, Column(TypeName = "varchar")] 
    public string firstName { get; set; } 

    [MaxLength(255), Required, Column(TypeName = "varchar")] 
    public string surname { get; set; } 
} 

我通常會在幾乎所有情況下使用VARCHAR而不是爲nvarchar的,所以我更希望有全球字符串列映射到varchar,並且如果需要,可以像上面那樣在每列上設置nvarchar。

有沒有人知道一種方法來做到這一點?我試圖省略爲我的模型中的每個字符串列輸入[Column(TypeName =「varchar」)]的需要。

回答

4

你必須把它寫成:

[Column(TypeName = "VARCHAR")] 
public string firstName { get; set; } 

對於許多信息,請看看這個link

+0

我意識到它可以按照我的例子這樣寫。我相信,儘管在全球範圍內必須有可能。 –

+0

您是否嘗試過流利的api ?,因爲有時DataAnnotation不會給我們帶來最好的結果 –

+0

我也有這個問題,並且這對我有用。如果您已經像我一樣創建了NVarchar列,這將使您添加的下一代Code First遷移解決了問題(將NVarchar列轉換爲Varchar)。好樣的! –

9

在EF 6,你可以用它來每個字符串屬性映射到使用VARCHAR而不是爲nvarchar

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Properties() 
      .Where(x => 
       x.PropertyType.FullName.Equals("System.String") && 
       !x.GetCustomAttributes(false).OfType<ColumnAttribute>().Where(q => q.TypeName != null && q.TypeName.Equals("varchar", StringComparison.InvariantCultureIgnoreCase)).Any()) 
      .Configure(c => 
       c.HasColumnType("varchar")); 
    } 
+1

如果你想在不檢查屬性的情況下將它們全部設置爲varchar,可以使用它:'modelBuilder.Properties ().Configure(c => c.HasColumnType(「varchar」));' –

-1

modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));