实体框架代码第一个命名约定 - 回到多个表名?

时间:2010-12-13 00:45:47

标签: c# entity-framework entity-framework-4 ef-code-first naming-conventions

我首先要对实体框架代码进行破解。根据他们的命名约定,我们现在必须将我们的表命名为复数,而不必使用该工具进行干预。我知道映射可以被过度使用。我的问题是,经过多年的单一命名约定,我们回到使用复数名称?

另外,我想知道为什么新的例子使用Northwind而不是Adventure Works。我在想是因为AW使用单一命名,他们无法展示无代码功能

3 个答案:

答案 0 :(得分:70)

Code First的RTM版本将完全支持名为 可插入约定 的酷炫功能,您可以在其中添加或替换默认约定,例如您提到的约定。

幸运的是,您正在寻找的内容已包含在CTP5中。您可以通过删除 PluralizingTableNameConvention 约定来关闭复数表名约定。这是您需要为此事写的所有代码:

using System.Data.Entity.ModelConfiguration.Conventions.Edm.Db;

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}


关于你的问题,你更多地看到Northwind数据库而不是Adventure Works的原因只是因为AW是一个巨大而Northwind是一个相当小的数据库因此使它更适合样本和演练。也就是说,你仍然需要编写一些代码来使用Code First中的Northwind数据库。

答案 1 :(得分:2)

这是我正在使用的代码的一个摘录,并且正在100%工作。尝试复制并粘贴并尝试它,它必须创建奇异的名称表名称。我正在使用EF4.1和CE4.0

POCO课程

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; }
    }
}

数据上下文

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);
        }
    }
}

种子初始化器

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);
        }
    }

尝试复制并粘贴此代码,然后编写一些代码以触发数据库创建(即尝试获取记录并在索引页面中显示)。

答案 2 :(得分:1)

我试过并且就像EF4 CTP5完全无视它。什么可能是错的?

使用部分:

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:

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课程

public class Blog
    {...}
public class BlogFeedback
    {...}
public class BlogCategoryList
    {...}
public class BlogCategory
    {...}

生成的表:

Blogs
BlogCategories
BlogCategoryLists
BlogFeedbacks

我需要什么:

Blog
BlogCategory
BlogCategoryList
BlogFeedback

有一件事可能有所不同,我将我的解决方案分成两个项目Core和Web。 Core拥有模型,服务和所有Code First。 Web只有控制器和视图以及对Core的引用。 SetInitializer()。Seed()在Core中的函数内部,在Web global.asax中调用Core.SetInitializer,因此将所有CTP5函数保留在Core中。正在重新创建数据库ok,数据填充正常,只是约定保持PLURAL TABLE NAMES,忽略modelBuilder覆盖