2015-09-08 88 views
2

我的大部分字符串的列我周圍設置50EF CodeFirst設置默認字符串長度並用DataAnnotations覆蓋?

而不是增加DataAnnotation [StringLength(50)]到每一個字符串屬性,我可以設置默認字符串代50,只有當我需要它默認不同的指定DataAnnotation ?

[StringLength(200)] 
public string Thing1 { get; set; } 
public string Thing2 { get; set; } 
public string Thing3 { get; set; } 
[MaxLength] 
public string Thing4 { get; set; } 

在這個例子中,Thing2和Thing3可能是VARCHAR(50)在默認情況下,因爲我已經專門設置它們,否則

許多實體和列Thing1和Thing2也會有所不同所以這不僅會節省我的時間,但使我的實體類看起來更清潔

澄清(爲了可能重複的問題): - 我不介意如何設置默認長度(FluentAPI或任何東西ELS e) - 我不介意如何設置覆蓋長度。我想覆蓋使用DataAnnotations

+0

可能重複[我怎樣才能改變字符串屬性的默認最大長度在實體框架6?(http://stackoverflow.com/questions/23689417/how-can-i-change-the- default-max-length-of-string-properties-in-entity-framework) – Claies

+0

這似乎是特別通過FluentApi。我想用DataAnnotations設置覆蓋。我將編輯我的問題以澄清 – mejobloggs

+0

當嘗試爲實體框架設置全局選項時,'fluentApi'是唯一的選項。使用'fluentApi'來設置默認值並不意味着你*不能*使用數據註解,它們被設計爲一起工作。 – Claies

回答

4

您可以使用自定義代碼的第一個約定。嘗試將它添加到你的上下文類:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Properties<string>() 
       .Configure(c => c.HasMaxLength(500)); 
} 

檢查有關Custom Code First Conventions

0

此鏈接獲取更多信息是,你可以使用自定義代碼的第一次大會,但你也需要有一個方法來指定將nvarchar(max)數據類型轉換爲字符串屬性。所以,我想出了以下解決方案。

/// <summary> 
/// Set this attribute to string property to have nvarchar(max) type for db table column. 
/// </summary> 
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public sealed class TextAttribute : Attribute 
{ 
} 

/// <summary> 
/// Changes all string properties without System.ComponentModel.DataAnnotations.StringLength or 
/// Text attributes to use string length 16 (i.e nvarchar(16) instead of nvarchar(max) by default). 
/// Use TextAttribute to a property to have nvarchar(max) data type. 
/// </summary> 
public class StringLength16Convention : Convention 
{ 
    public StringLength16Convention() 
    { 
     Properties<string>() 
      .Where(p => !p.GetCustomAttributes(false).OfType<DatabaseGeneratedAttribute>().Any()) 
      .Configure(p => p.HasMaxLength(16)); 

     Properties() 
      .Where(p => p.GetCustomAttributes(false).OfType<TextAttribute>().Any()) 
      .Configure(p => p.IsMaxLength()); 
    } 
} 

public class CoreContext : DbContext, ICoreContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //Change string length default behavior. 
     modelBuilder.Conventions.Add(new StringLength16Convention()); 
    } 
} 


public class LogMessage 
{ 
    [Key] 
    public Guid Id { get; set; } 


    [StringLength(25)] // Explicit data length. Result data type is nvarchar(25) 
    public string Computer { get; set; } 

    //[StringLength(25)] // Implicit data length. Result data type is nvarchar(16) 
    public string AgencyName { get; set; } 

    [Text] // Explicit max data length. Result data type is nvarchar(max) 
    public string Message { get; set; } 
}