我正在使用Entity Framework 6开发代码优先数据库。
我知道我可以在模型的属性上设置[MaxLength(myLen)]
。
我想知道的是,是否可以在过滤器或自定义属性中执行此操作,以便所有字符串都采用默认值,即250,除非直接在属性上指定。
如果失败了,有没有办法更改nvarchar(max)
的默认值?
答案 0 :(得分:8)
实体框架在6.1
中为此引入了Custom Code First ConventionsmodelBuilder.Properties<string>()
.Configure(c => c.HasMaxLength(250));
约定以最后的胜利方式运行,Fluent API和数据注释可用于在特定情况下覆盖约定
答案 1 :(得分:5)
您可以执行此操作,这可确保所有字符串都是数据库提供程序支持的最大长度:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<string>().Configure(p => p.IsMaxLength());
}
在DbContext
课程中添加此方法(或修改现有方法)。
答案 2 :(得分:1)
在EF6中,您可以使用自定义代码优先约定,但您还需要有一种方法将nvarchar(max)数据类型指定为字符串属性。所以,我提出了以下解决方案。 另见: https://msdn.microsoft.com/en-us/data/jj819164#order
/// <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; }
}
答案 3 :(得分:0)
在此代码中,ModelBuilder类定义了实体的形状,它们之间的关系以及它们如何映射到数据库。
public class WebsiteDBContext : DbContext
{
public WebsiteDBContext(DbContextOptions<WebsiteDBContext> options) : base(options)
{
}
public DbSet<Global> Globals { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
// it should be placed here, otherwise it will rewrite the following settings!
base.OnModelCreating(builder);
builder.Entity<Global>();
builder.Entity<Global>(entity =>
{
entity.Property(global => global.MainTopic).HasMaxLength(150).IsRequired();
entity.Property(global => global.SubTopic).HasMaxLength(300).IsRequired(false);
entity.Property(global => global.Subject).IsRequired(false);
entity.Property(global => global.URL).HasMaxLength(150).IsRequired(false);
});
}
}