Entity Framework - CTP4 - Code First - Как отключить автоматическое множественное число? - PullRequest
6 голосов
/ 30 августа 2010

Мое имя объекта - "Контакт", а имя моей таблицы - "Контакт". Тем не менее, поддержка плюрализации по умолчанию заставляет EF4 искать таблицу с именем «Контакты». У кого-нибудь есть идеи как отключить поддержку плюрализации?

В этом посте есть некоторые подробности о поддержке плюрализации. Но все равно не дает мне ответа.

Я вижу следующий текст в этом сообщении. Прежде всего, я не знаю, какой физический файл .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: модель поддержки "адресной книги" контекст изменился, так как база данных был создан. Либо вручную удалить / обновить базу данных или позвонить Database.SetInitializer с Экземпляр 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.Add (TEntity субъект) в CodeFirst.Client.Program.Main (String [] args) в E: \ Ashish \ Research \ VS Решения \ EntityFramework \ CodeFirstApproach_EF_CTP4 \ CodeFirst.Client \ Program.cs: строка 35

Я уверен, что где-то совершаю глупую ошибку, просто не могу понять. Может ли кто-нибудь дать несколько указаний?

ОТВЕТ С помощью Pault я описал эту проблему и решение здесь .

Ответы [ 5 ]

6 голосов
/ 07 сентября 2010

Я добавляю еще один третий ответ, когда мое понимание вопроса меняется ... это плохо для меня? ;)

Как я уже сказал в своем комментарии, я все еще учусь, и я еще не пытался сделать это с существующей базой данных. Тем не менее, надеюсь, один из них поможет:

В сообщении, которое я упомянул Скоттом Гатри (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) в недавнем прошлом. Он предполагает, что это может быть вариант:

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

Надеюсь, один из них выведет вас на правильный путь.

4 голосов
/ 24 апреля 2013
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }
2 голосов
/ 05 сентября 2010

Вы просто пытаетесь настроить таргетинг на конкретное имя таблицы?

Если это так, это может быть ответ, который вы ищете:

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

Помогает ли это или я полностью пропустилсмысл?

0 голосов
/ 24 июля 2014
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
    }
0 голосов
/ 06 сентября 2010

Изначально код, выполняющий первые шаги, не будет изменять или удалять существующую базу данных.Я предполагаю, что у вас есть существующая база данных, которую вы либо создали вручную, либо фреймворк, созданный при запуске вашей программы ранее, а затем вы изменили свой класс 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 (), если это веб-приложение):

Database.SetInitializer(new MyCustomDataContextInitializer());

Обратите внимание, что вам нужно:

using System.Data.Entity.Infrastructure;

Помогает ли это?

...