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

时间:2010-08-30 13:16:51

标签: entity-framework-4 code-first

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

This帖子已经获得了有关复数支持的一些细节。但仍然没有给我一个答案。

我在this帖子中看到以下文字。首先,我不知道我需要哪个物理.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; }
 }

上下文: -

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

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

}

主程序: -

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

  }

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

  

System.InvalidOperationException:The   支持'AddressBook'的模型   自数据库以来,上下文已经改变   创建了。手动   删除/更新数据库,或者调用   Database.SetInitializer with   IDatabaseInitializer实例。对于   例如,   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.EfInternalQuery 1.Initialize()   在   System.Data.Entity.DbSet 1.ActOnSet(Action action,EntityState newState, TEntity entity) at System.Data.Entity.DbSet 1.增加(TEntity   实体)   CodeFirst.Client.Program.Main(字符串[]   ar:)在E:\ Ashish \ Research \ VS.   Solutions \ EntityFramework \ CodeFirstApproach_EF_CTP4 \ CodeFirst.Client \ Program.cs:第35行

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

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

5 个答案:

答案 0 :(得分: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

在最近的这篇文章(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;
   }
   ...
}

希望其中一条能让你走上正轨。

答案 1 :(得分:4)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }

答案 2 :(得分:2)

您是否只是尝试定位特定的表名?

如果是这样,这可能是您正在寻找的答案:

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

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Contact>().MapSingleType().ToTable("Contact");
    }
}

这有帮助还是我完全忽略了这一点?

答案 3 :(得分:0)

开箱即用,代码优先的东西不会修改或删除现有的数据库。我猜你有一个手动创建的现有数据库或者之前运行程序创建的框架,然后你改变了你的Contact类。一次修复此错误的快速方法是手动删除数据库,或更新它以匹配您的模型。

然而,代码优先功能集的真正强大之处在于允许快速创建域和重构,而无需担心在开发早期创建和维护数据库脚本。为此,我个人发现每次对模型进行更改时,允许框架为我删除数据库是有用的。当然,这也意味着我想用测试数据为数据库播种。

以下是如何做到这一点:

public class MyCustomDataContextInitializer : RecreateDatabaseIfModelChanges<MyCustomDataContext> //In your case AddressBook
{
    protected override void Seed(MyCustomDataContext context)
    {
        var contact = new Contact
        {
            ContactID = 10000,
            FirstName = "Brian",
            LastName = "Lara",
            ModifiedDate = DateTime.Now,
            AddDate = DateTime.Now,
            Title = "Mr."
        };
        context.Contact.Add(contact);
        context.SaveChanges();
    }
}

然后你需要注册这个初始化程序(例如在Application_Start()中,如果它是一个Web应用程序):

Database.SetInitializer(new MyCustomDataContextInitializer());

请注意,您需要:

using System.Data.Entity.Infrastructure;

这有帮助吗?

答案 4 :(得分:0)

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
    }