1

我有一个基类,就像我的 POCO 对象一样

 public abstract class BASE
    {
        protected BASE()
        {
            Created = DateTime.UtcNow;
            Modified = Created;

        }

        public int id { get; set; }
        public DateTime Created { get; set; }
        public DateTime Modified { get; set; }
        [MaxLength(50)]
        public string CreatedBy { get; set; }
        [MaxLength(50)]
        public string ModifiedBy { get; set; }
    }

我想要做的是使用流利的 API 设置“MaxLength(50)”属性。

但如果我在Context.ModelCreating

modelBuilder.Entity<BASE>().Property(p => p.CreatedBy).HasMaxLength(50);
modelBuilder.Entity<BASE>().Property(p => p.ModifiedBy).HasMaxLength(50);

然后在数据库中生成“BASEs”表——我想避免这种情况。

我错过了什么,能够在 Fluent API 中设置这些约束?

4

2 回答 2

1

您可以使用EntityTypeConfiguration<TEntity>来配置最大长度。

创建一个基类来映射BASE属性。

public class MyEntityMap<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : BASE
{
    public MyEntityMap()
    {
        Property(p => p.CreatedBy).HasMaxLength(50);
        Property(p => p.CreatedBy).HasMaxLength(50);
    }
}

然后MyEntityMap<TEntity>为每个派生类创建。

public class DerivedMap : MyEntityMap<Derived>
{
    public DerivedMap()
    {
        //mappings
    }
}

modelBuilder.Configurations.Add(new DerivedMap());
于 2012-09-07T11:30:50.670 回答
1

我刚刚以 Code First 方法将此答案用于 EF 6。用于设置表的 SQL 脚本按我预期的方式生成。基类中映射的所有列,包括在从此类派生的表脚本中

public abstract class BaseMap<T> : EntityTypeConfiguration<T> where T : DbBase
    {
        protected BaseMap()
        {
            Ignore(t => t.DbGuid);

            // Properties

            Property(t => t.CreatedBy)
                .IsRequired()
                .HasMaxLength(50);

            Property(t => t.ChangedBy)
                .HasMaxLength(50);

            Property(t => t.DeletedBy)
                .HasMaxLength(50);

            Property(t => t.RowVersion)
                .IsRequired()
                .IsFixedLength()
                .HasMaxLength(8)
                .IsRowVersion()
                .IsConcurrencyToken();

            // Table & Column Mappings
            Property(t => t.CreatedAt).HasColumnName("CreatedAt");
            Property(t => t.CreatedBy).HasColumnName("CreatedBy");
            Property(t => t.ChangedAt).HasColumnName("ChangedAt");
            Property(t => t.ChangedBy).HasColumnName("ChangedBy");
            Property(t => t.DeletedAt).HasColumnName("DeletedAt");
            Property(t => t.DeletedBy).HasColumnName("DeletedBy");
            Property(t => t.RowVersion).HasColumnName("RowVersion");
        }
    }
于 2014-01-29T08:42:24.397 回答