首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为EF6中的所有属性创建自定义属性映射

为EF6中的所有属性创建自定义属性映射
EN

Stack Overflow用户
提问于 2015-11-28 11:43:59
回答 3查看 1.8K关注 0票数 0

型号:

实体类作为Id在所有实体之间共享。

代码语言:javascript
复制
public abstract class Entity
{
    public int Id { get; set; }
}

和学生类,它继承实体类

代码语言:javascript
复制
public class Student : Entity
{
    public string LastName { get; set; }

    public string Forenames { get; set; }

    public DateTime EnrolmentDate { get; set; }

    public virtual ICollection<Enrolment> Enrolments { get; set; }
}

表列具有命名约定STUDENT_ID、LAST_NAME、FORENAMES等。所有表都将具有NAME_ID的ID列。

如何为所有实体类中的所有属性创建自定义映射?引用的代码这里不工作,因为.Entities()方法不再存在。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-28 16:19:05

我无法将这两个答案标记为正确的(它们是正确的),但我试图实现的想法是将所有列名自动从ColumnName映射到COLUMN_NAME,而不必为每个属性手动指定列名。

我从循环遍历实体列映射以转换列名。中找到了答案,除了ID列外,每个列都有效,所以我只需使用Yacoub建议的代码手动设置这些答案。

所以:

代码语言:javascript
复制
// Make all properties UPPER_CASE
modelBuilder.Properties()
            .Configure(x => x.HasColumnName(Regex.Replace(x.ClrPropertyInfo.Name, "(?<=.)(?=[A-Z])", "_").ToUpper()));

// Set the ID columns to ENTITY_ID
modelBuilder.Entity<Course>()
    .ToTable("COURSE")
    .Property(x => x.Id)
    .HasColumnName("STUDENT_ID");

如果我没有那么多的表和列,那么为每个属性设置[Column("ENTITY_ID")]属性都会很好,但是随着数据库的增长,并且添加了越来越多的实体类,它可能会非常重复,并且可能会很脆弱,因为它是手动命名的。

票数 1
EN

Stack Overflow用户

发布于 2015-11-28 12:07:23

重写上下文类上的OnModelCreating方法,然后可以为每个实体设置ID列的自定义名称,如下所示:

代码语言:javascript
复制
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>().Property(x => x.Id).HasColumnName("STUDENT_ID");
    modelBuilder.Entity<Teacher>().Property(x => x.Id).HasColumnName("TEACHER_ID");
}
票数 2
EN

Stack Overflow用户

发布于 2015-11-28 11:50:30

可以使用column属性进行自定义列名映射:

代码语言:javascript
复制
public class Student
{
  [Column("STUDENT_ID")]
  public int Id { get; set; }

  //...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33970945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档