6

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

这篇文章有一些关于多元化支持的细节。但是还是没有给我答案。

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

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

C#
generator.Pluralize = false;

VB
生成器.Pluralize = False

更新

以下是我使用的代码,我收到以下错误:-

接触

 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:支持“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() 在System.Data.Entity.DbSet 1.Add 1.ActOnSet(Action action,EntityState newState, TEntity entity) at System.Data.Entity.DbSet(TEntity entity) 在 CodeFirst.Client.Program.Main(String[] args) 在 E:\Ashish\ Research\VS Solutions\EntityFramework\CodeFirstApproach_EF_CTP4\CodeFirst.Client\Program.cs:line 35

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

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

4

5 回答 5

6

我正在添加第三个答案,因为我对问题的理解发生了变化……对我不利吗?;)

就像我在评论中所说的那样,我仍在学习,我还没有尝试使用现有数据库进行此操作。也就是说,希望其中之一会有所帮助:

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

Database.SetInitializer<AddressBook>(null); //AddressBook being the context

最近,我还偶然看到了 Rowan Miller 在这篇文章 ( http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4announcement.aspx?PageIndex=2 ) 下面的评论。他建议这可能是一种选择:

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

希望其中之一能让你走上正确的轨道。

于 2010-09-07T02:15:49.380 回答
4
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }
于 2013-04-24T10:08:25.527 回答
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");
    }
}

这有帮助还是我完全错过了重点?

于 2010-09-05T19:34:14.767 回答
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;

这有帮助吗?

于 2010-09-06T17:04:29.747 回答
0
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
    }
于 2014-07-24T07:09:45.583 回答