实体框架 - CTP4 - 代码优先 - 如何关闭自动复数?

Ash*_*pta 6 code-first entity-framework-4

我的实体名称是"联系人",我的表名是"联系人".但是,默认的复数支持是使EF4查找名为"Contacts"的表.有人知道如何关闭多元化支持吗?

这篇文章有关于多元化支持的一些细节.但仍然没有给我一个答案.

我在这篇文章中看到了以下文字.首先,我不知道我需要哪个物理.tt文件进行此更改.此外,我希望仅为一个应用程序而不是所有应用程序关闭此功能.

T4 Toolbox中的代码生成器默认情况下在Visual Studio 2010中打开了复数.如果您需要生成DAL而不进行复数化,可能出于兼容性原因,您可以通过在.tt文件中添加以下行来关闭此选项调用generator.Run()方法.

C#
generator.Pluralize = false;

VB
generator.Pluralize = False

*****UPDATE*****

以下是我使用的代码,我得到一个错误如下: -

联系

 public class Contact
 {
 public int ContactID { get; set; }
 public string FirstName { get; set; }
 public string LastName { get; set; }
 public string Title { get; set; }
 public DateTime AddDate { get; set; }
 public DateTime ModifiedDate { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

语境: -

 public class AddressBook : DbContext
 {
 public DbSet<Contact> Contact { get; set; }

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
  modelBuilder.Entity<Contact>().MapSingleType().ToTable("dbo.Contact");
 }
Run Code Online (Sandbox Code Playgroud)

}

主要方案: -

using (var context = new AddressBook())
  {
   var contact = new Contact
   {
   ContactID = 10000,
   FirstName = "Brian",
   LastName = "Lara",
   ModifiedDate = DateTime.Now,
   AddDate = DateTime.Now,
   Title = "Mr."

   };
   context.Contact.Add(contact);
   int result = context.SaveChanges();
   Console.WriteLine("Result :- " + result.ToString());

  }
Run Code Online (Sandbox Code Playgroud)

我在"context.Contact.Add(contact);"上收到以下错误: -

System.InvalidOperationException:自创建数据库以来,支持"AddressBook"上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.在System.Data.Entity.Infrastructure.CreateDatabaseOnlyIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Infrastructure.Database.Initialize() at System.Data.Entity.Internal.InternalContext.Initialize() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.EfInternalQuery1.Initialize()at System.Data.Entity.DbSet 1.Add(1.ActOnSet(Action action,EntityState newState, TEntity entity) at System.Data.Entity.DbSetTEntity entity)at CodeFirst.Client.Program.Main(String [] args)in E:\ Ashish\Research\VS Solutions\EntityFramework\CodeFirstApproach_EF_CTP4\CodeFirst.Client\Program.cs:第35行

我确信我在某个地方犯了一个愚蠢的错误,只是无法搞清楚.有人可以提供一些指示吗?

答案 在Pault的帮助下,我在这里描述了这个问题和解决方案.

ptr*_*dem 6

我正在添加第三个答案,因为我对这个问题的理解发生了变化......对我来说是不是很糟糕?;)

就像我在评论中说的那样,我还在学习,但我还没有尝试使用现有的数据库.也就是说,希望其中一个有助于:

我在Scott Guthrie提到的帖子(http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx)发表了评论某个杰夫说这可以提供帮助(我建议阅读完整的评论,因为他更详细地解释):

Database.SetInitializer<AddressBook>(null); //AddressBook being the context
Run Code Online (Sandbox Code Playgroud)

在最近的这篇文章(http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4announcement.aspx?PageIndex=2)下,我也发生过Rowan Miller的评论.他建议这可能是一个选择:

public class ProductContext : DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.IncludeMetadataInDatabase = false;
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

希望其中一个能让你走上正轨.