TableAttribute和ColumnAttribute在mysql中映射字段名称时无法被ef解析使用
stackoverflow中有人提供了用反射的做法
不过并没有加上类名只有字段名
这里添加了类名并且优化了写法
新建一个类似DbBase : DbContext的基类
新建一个方法如下
protected void build<TEntity>(ModelBuilder modelBuilder) where TEntity : class
{
Type t = typeof(TEntity);
var etb = modelBuilder.Entity<TEntity>();
var property = t.GetTypeInfo().GetCustomAttribute<TableAttribute>();
if (property != null) modelBuilder.Entity<TEntity>().ToTable(property.Name);
var properties = t.GetTypeInfo().GetProperties(
BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var p in properties)
{
if (p.GetCustomAttribute<NotMappedAttribute>() != null)
{
etb.Ignore(p.Name);
continue;
}
var c = p.GetCustomAttribute<ColumnAttribute>();
if (c != null)
{
etb.Property(p.Name).HasColumnName(c.Name);
continue;
}
etb.Property(p.Name).HasColumnName(p.Name);
}
}
然后让其它类继承这个类时
在重写override void OnModelCreating(ModelBuilder modelBuilder)方法时调用该方法即可
例
build<User>(modelBuilder);
搞定
经测试有效
stackoverflow中有人提供了用反射的做法
不过并没有加上类名只有字段名
这里添加了类名并且优化了写法
新建一个类似DbBase : DbContext的基类
新建一个方法如下
protected void build<TEntity>(ModelBuilder modelBuilder) where TEntity : class
{
Type t = typeof(TEntity);
var etb = modelBuilder.Entity<TEntity>();
var property = t.GetTypeInfo().GetCustomAttribute<TableAttribute>();
if (property != null) modelBuilder.Entity<TEntity>().ToTable(property.Name);
var properties = t.GetTypeInfo().GetProperties(
BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var p in properties)
{
if (p.GetCustomAttribute<NotMappedAttribute>() != null)
{
etb.Ignore(p.Name);
continue;
}
var c = p.GetCustomAttribute<ColumnAttribute>();
if (c != null)
{
etb.Property(p.Name).HasColumnName(c.Name);
continue;
}
etb.Property(p.Name).HasColumnName(p.Name);
}
}
然后让其它类继承这个类时
在重写override void OnModelCreating(ModelBuilder modelBuilder)方法时调用该方法即可
例
build<User>(modelBuilder);
搞定

