实体框架:一种全局覆盖命名约定的方法?

时间:2015-01-25 12:12:03

标签: entity-framework customization naming-conventions

我们有一个项目必须链接到繁重的数据库基础设施(10年以上的生活),许多工具仍以各种方式运行。

主软件有自己的常规模型来处理外键和主键,不幸的是它与EF约定略有不同。

EF:表“课程”有一个名为“ID”或“CourseID”的PK 我们:表“课程”是多元化的,有一个名为“nID”的PK

EF:表“PlayerInscription”在表“课程”中有一个名为“CourseID”的FK 美国:表格“PlayerInscriptions”是多元化的,并且在表格“Courses”中有一个名为“nCOURSE_ID”的FK

我知道我可以在每个实体上逐个覆盖键,但对于这个大项目,它涉及很多表,关系键,这会产生非常繁重的工作和额外的符号。

您是否知道是否存在覆盖整个项目的EF约定的方法,让databasefirst比所有注释更“流畅”地管理模型?

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是:

using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace NamingConventionTest
{
    public class Program
    {
        static void Main(string[] args)
        {
            MyDbContext dbctx = new MyDbContext();
            var c = new Course()
            {
                SomeStringProp = "test",
                SomeIntProp = 1
            };

        dbctx.Set<Course>().Add(c);
        dbctx.SaveChanges();


    }

    public class MyDbContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties<int>()
                        .Where(p => p.Name.Contains("ID"))
                        .Configure(p => p.IsKey());

            modelBuilder.Conventions.Add(new IdConvention());
        }

        public DbSet<Course> Courses { get; set; }

        public class IdConvention : Convention
        {
            public IdConvention()
            {
                this.Properties<int>()
                    .Where(x => x.Name.Contains("Id"))
                    .Configure(x => x.HasColumnName("asdID"));
            }
        }
    }

    public class Course
    {
        [Key]
        public int Id { get; set; }
        public string SomeStringProp { get; set; }
        public int SomeIntProp { get; set; }
    }
}
}