代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

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

  •  6
  • Ashish Gupta Shiva  · 技术社区  · 14 年前

    我的实体名是“Contact”,表名是“Contact”。不过,默认的复数化支持是让EF4查找名为“Contacts”的表。有人知道如何关闭多元化支持吗?

    This 波斯特有一些关于多元化支持的细节。但还是没有给我答案。

    我在书中看到以下文字 this

    T4工具箱中的代码生成器 多元性在默认情况下开启 在VisualStudio2010中。如果你需要的话 生成DAL 多元化,也许是为了 在前面的.tt文件的下面一行 发电机。运行()方法被调用。

    C级#
    发电机。多元化=假;


    发电机。多元化=错误

    *****更新*****

     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添加(联系人);“:-

    System.InvalidOperationException异常:的 支持“地址簿”的模型 自数据库创建以来,上下文已更改 已创建。或者手动 删除/更新数据库,或调用 数据库.SetInitializer带着一个 IDatabaseInitializer实例。为了 例如 重新创建DatabaseIfModelChanges 重新创建数据库 给它植入新的数据。在 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.ActOnSet(Action action,EntityState newState, TEntity entity) at System.Data.Entity.DbSet 1.添加(TEntity) args)在E:\Ashish\Research\VS中 解决方案\EntityFramework\CodeFirstApproach\u EF\u CTP4\代码优先。客户端\程序.cs:第35行

    回答 在保罗的帮助下,我描述了这个问题和解决方法 here

    5 回复  |  直到 14 年前
        1
  •  6
  •   ptrandem    14 年前

    随着我对这个问题的理解的改变,我在补充第三个答案。。。我这样不好吗?;)

    正如我在评论中所说的,我仍在学习,而且我还没有尝试使用现有的数据库。也就是说,希望其中之一能有所帮助:

    我提到的斯科特·古思里的帖子( 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
    

    我也碰巧在这篇文章下面看到了罗文·米勒的评论( 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;
       }
       ...
    }
    

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

        2
  •  4
  •   Bart Moonen    12 年前
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }
    
        3
  •  2
  •   ptrandem    14 年前

    您只是试图针对一个特定的表名吗?

    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");
        }
    }
    

    这有帮助吗?还是我完全没有抓住重点?

        4
  •  0
  •   ptrandem    14 年前

    开箱即用,代码优先的东西不会修改或删除现有的数据库。我猜您已经有了一个现有的数据库,或者是手动创建的,或者是通过运行程序创建的框架,然后更改了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();
        }
    }
    

    Database.SetInitializer(new MyCustomDataContextInitializer());
    

    请注意,您需要:

    using System.Data.Entity.Infrastructure;
    

    这有用吗?

        5
  •  0
  •   Sanjay Sharma    11 年前
        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
        }