實體框架6:正確使用“自定義代碼優先約定”功能?

entity-framework entity-framework-6

我的要求是全局配置字符串長度映射,但也可以使用MaxLengthAttribute特別配置屬性。這是我的代碼:

public class StringLengthConvention
: IConfigurationConvention<PropertyInfo, StringPropertyConfiguration>
{
    public void Apply(
        PropertyInfo propertyInfo,
        Func<StringPropertyConfiguration> configuration)
    {
        StringAttribute[] stringAttributes = (StringAttribute[])propertyInfo.GetCustomAttributes(typeof(StringAttribute),true);
        if (stringAttributes.Length > 0)
        {
            configuration().MaxLength = stringAttributes [0].MaxLength;
        }
    }
}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {           
        modelBuilder.Conventions.Add<StringLengthConvention>();
    }

public class ContentInfo
{
   // ...
    [MaxLength(200)]
    [String]        
    public string TitleIntact { get; set; }
   // ...
}

我的問題是“MaxLength”不能再工作了。在StringLengthConvention.Apply()中應用全局配置之前,是否需要檢查屬性是否具有MaxLengthAttribute?

一般承認的答案

在這種情況下可以使用的是創建一個輕量級約定,指定字符串的MaxLength屬性。在這種情況下,約定將為所有字符串設置屬性的最大長度,除非它已由註釋配置,使用流暢的API或其他約定。

在OnModelCreate方法中,添加以下代碼以設置默認的MaxLength:

modelBuilder.Properties<string>()
            .Configure(c => c.HasMaxLength(DefaultStringLength));

這裡有一些常規: http//msdn.microsoft.com/en-us/data/jj819164.aspx請務必查看頁面底部的“更多示例”




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因