实体框架6:正确使用“自定义代码优先约定”功能?

时间:2012-12-18 10:43:48

标签: 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; }
   // ...
}

我的问题是&#34; MaxLength&#34;不能再工作了。在StringLengthConvention.Apply()中应用全局配置之前,是否需要检查属性是否具有MaxLengthAttribute?

1 个答案:

答案 0 :(得分:2)

在这种情况下可以使用的是创建一个轻量级约定,指定字符串的MaxLength属性。在这种情况下,约定将为所有字符串设置属性的最大长度,除非它已由注释配置,使用流畅的API或其他约定。

在OnModelCreate方法中添加以下代码以设置默认的MaxLength:

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

这里有一些常规:http://msdn.microsoft.com/en-us/data/jj819164.aspx 请务必查看页面底部的“更多示例”