我只是先破解实体框架代码。按照他们的命名约定,我们现在必须将我们的表命名为复数,而不必干预该工具。我知道映射可以被覆盖。我的问题是,在遵循单数命名约定多年之后,我们是否又回到了使用复数名称?
另外,我想知道为什么新示例使用 Northwind 而不是 Adventure Works。我认为原因是因为 AW 使用单数命名,他们无法展示无代码功能
我只是先破解实体框架代码。按照他们的命名约定,我们现在必须将我们的表命名为复数,而不必干预该工具。我知道映射可以被覆盖。我的问题是,在遵循单数命名约定多年之后,我们是否又回到了使用复数名称?
另外,我想知道为什么新示例使用 Northwind 而不是 Adventure Works。我认为原因是因为 AW 使用单数命名,他们无法展示无代码功能
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 数据库。
这是我正在使用的代码的一个摘录,并且正在 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);
}
}
尝试复制并粘贴此代码,然后编写一些代码来触发数据库创建(即尝试获取记录并显示在索引页面中)。
我试过了,就像 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 覆盖