38

我只是先破解实体框架代码。按照他们的命名约定,我们现在必须将我们的表命名为复数,而不必干预该工具。我知道映射可以被覆盖。我的问题是,在遵循单数命名约定多年之后,我们是否又回到了使用复数名称?

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

4

3 回答 3

73

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

幸运的是,您要查找的内容已包含在 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 数据库。

于 2010-12-13T16:11:20.727 回答
3

这是我正在使用的代码的一个摘录,并且正在 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);
        }
    }

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

于 2011-05-23T09:15:06.533 回答
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;

数据库上下文:

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。核心有模型、服务和所有代码优先。Web 只有控制器和视图以及对 Core 的引用。SetInitializer().Seed() 在 Core 的一个函数中,而在 Web global.asax 中调用了 Core.SetInitializer,因此将所有 CTP5 函数保留在 Core 中。数据库正在重新创建好,数据已填充好,只是约定保留 PLURAL TABLE NAMES,忽略 modelBuilder 覆盖

于 2011-04-30T14:59:51.543 回答