关于c#:Entity Framework Code第一个命名约定 – 回到多个表名?

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重写