修复从数据库生成的EF代码

时间:2014-05-01 22:53:07

标签: c# entity-framework code-generation t4

我正在使用EF工具包从现有数据库创建我的POCO类。随着项目的进行,我将不得不多次生成这些类。生成的类有一些问题我不想每次生成代码时都要纠正。

问题1:

当表有两个外键到同一个表时,它不会生成良好的属性名称。例如:

它生成:

public partial class Flow
    {
        public virtual Element Element { get; set; }
        public virtual Element Element1 { get; set; }
    }

我想要的时候:

public partial class Flow
    {
        public virtual Element FromElement { get; set; }
        public virtual Element ToElement { get; set; }
    }

我通过使用类似的部分类解决了这个问题:

public partial class Flow
{
    public virtual Element FromElement 
    {
        get {return Element;}
        set { Element = value; }
    }
    public virtual Element ToElement 
    {
        get {return Element1;}
        set {Element1=value;}
    }
}

这样我就不必编辑生成的类了。

第二个问题:

它无法识别数据库上的自动增量GUID属性。它会生成:

 public partial class Process
     {
         public System.Guid ProcessId { get; set; }
     }

什么时候应该生成:

public partial class Process
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public System.Guid ProcessId { get; set; }
    }

问题是,如何告诉EF这些列是自动增量而无需插入 “[DatabaseGenerated(DatabaseGeneratedOption.Identity)]”在生成的类上的每个主键字段之前?

1 个答案:

答案 0 :(得分:0)

实际上,我发现很容易为生成的代码核心T4模板。只需编辑Mapping.tt并在下面的代码中插入最后一行。:

// Primary Key
<#
    if (efHost.EntityType.KeyMembers.Count() == 1)
    {
#>
            this.HasKey(t => t.<#= efHost.EntityType.KeyMembers.Single().Name #>)
            .Property(t => t.<#= efHost.EntityType.KeyMembers.Single().Name #>).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);