Entity Framework Code First naming conventions - back to plural table names?
我只是先了解一下实体框架代码。按照它们的命名约定,我们现在必须将表命名为复数,而不必使用该工具进行干预。我知道这些映射可以被覆盖。我的问题是,在遵循单数命名惯例多年之后,我们是不是又回到使用复数名称了?
另外,我想知道为什么新的例子是使用北风而不是冒险工作。我认为原因是因为aw使用的是单一的命名,它们不能显示无代码特性。
代码优先的RTM版本将完全支持一个称为可插拔约定(PluggableConventions)的很酷的功能,您可以在其中添加或替换您提到的默认约定。
幸运的是,您正在寻找的已经包含在CTP5中。您可以通过删除复数表名约定来关闭复数表名约定。这是您为此编写的所有代码:
1 2 3 4 5 6 | using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db; protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } |
关于你的第二个问题,你看到Northwind数据库多于Adventure Works的原因仅仅是因为aw是一个巨大的,Northwind是一个相当小的数据库,因此它更适合于样本和演练。也就是说,您仍然需要先编写一些代码来使用Northwind数据库中的代码。
下面是我正在使用的代码的一个摘录,它可以100%地工作。尝试复制粘贴并尝试,它必须创建单一名称表名。我用的是EF4.1和CE4.0
POCO类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace CloudOne.Models { public class Brand { public int BrandID { get; set; } [MaxLength(25)] [Required] public string BrandName { get; set; } [MaxLength(1000)] public string BrandDescription { get; set; } public int SortOrder { get; set; } //SEO [MaxLength(70)] public string PageTitle { get; set; } [MaxLength(100)] public string MetaDescription { get; set; } [MaxLength(150)] public string MetaKeywords { get; set; } [MaxLength(56)] //50 +"-" + 99,000 public string Slug { get; set; } } } |
数据上下文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace CloudOne.Models { public class SiteDataContext: DbContext { public DbSet<Brand> Brands { get; set; } // Twist our database protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); base.OnModelCreating(modelBuilder); } } } |
种子初始值设定项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class SiteDataContextInitializer: DropCreateDatabaseIfModelChanges<SiteDataContext> { protected override void Seed(SiteDataContext context) { var brands = new List<Brand>() { new Brand { BrandName ="Brand 1", Slug ="brand-1" }, new Brand { BrandName ="Brand 2", Slug ="brand-2" } }; brands.ForEach(d => context.Brands.Add(d)); base.Seed(context); } } |
尝试复制和粘贴此代码,然后编写一些代码以触发数据库创建(即尝试获取记录并显示在索引页中)。
我试过了,就像EF4CTP5完全忽略了它。可能有什么问题?
使用截面:
1 2 3 4 5 6 7 8 | using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Conventions.Edm; |
DbContext:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class SiteDataContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<BlogFeedback> BlogFeedbacks { get; set; } public DbSet<BlogCategoryList> BlogCategoryLists { get; set; } public DbSet<BlogCategory> BlogCategories { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); base.OnModelCreating(modelBuilder); } } |
POCO类
1 2 3 4 5 6 7 8 | public class Blog {...} public class BlogFeedback {...} public class BlogCategoryList {...} public class BlogCategory {...} |
生成的表:
1 2 3 4 | Blogs BlogCategories BlogCategoryLists BlogFeedbacks |
我需要什么:
1 2 3 4 | Blog BlogCategory BlogCategoryList BlogFeedback |
有一件事可能不同,我将我的解决方案分为两个项目核心和Web。核心首先拥有模型、服务和所有代码。Web只有控制器和视图以及对核心的引用。setinitializer().seed()位于core中的函数内,在web global.asax中调用core.setinitializer,因此将所有ctp5函数都保留在core中。正在重新创建数据库确定,数据已填充确定,只是约定保留多个表名,忽略ModelBuilder重写