EF 4.1 все портит.Изменилась ли стратегия именования FK? - PullRequest
9 голосов
/ 17 марта 2011

Я только что установил новый пакет NuGet Entity Framework 4.1, тем самым заменив пакет EFCodeFirst в соответствии с инструкциями NuGet и этой статьи Скотта Хансельмана .

Теперь представьте себе следующую модель:

public class User
{
    [Key]
    public string UserName { get; set; }
    // whatever
}

public class UserThing
{
    public int ID { get; set; }
    public virtual User User { get; set; }
    // whatever
}

Последний выпуск EFCodeFirst сгенерировал внешний ключ в таблице UserThing с именем UserUserName.

После установки и запуска нового выпуска я получаю следующую ошибку:

Invalid column name 'User_UserName'

Что, конечно, означает, что в новом выпуске другая стратегия именования FK. Это согласуется со всеми другими таблицами и столбцами: независимо от того, какой FK EFCodeFirst с именем AnyOldForeignKeyID EF 4.1 хочет вызвать AnyOldForeignKey_ID (обратите внимание на подчеркивание).

Я не возражаю называть FK подчеркиванием, но в этом случае это означает, что необходимо либо излишне выбросить базу данных и воссоздать ее, либо излишне переименовать все FK.

Кто-нибудь знает, почему изменилось соглашение об именах FK и можно ли его настроить без использования Fluent API ?

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Почему бы вам не сделать следующее?

  public class User
  {
    [Key]
    public string UserName { get; set; }
    // whatever
  }

  public class UserThing
  {
    public int ID { get; set; }
    public string UserUserName { get; set; }
    [ForeignKey("UserUserName")]
    public virtual User User { get; set; }
    // whatever
  }

Или, если вы не хотите добавлять свойство UserUserName в UserThing, используйте свободный API, например:

// class User same as in question
// class UserThing same as in question

public class MyContext : DbContext
{
  public MyContext()
    : base("MyCeDb") { }
  public DbSet<User> Users { get; set; }
  public DbSet<UserThing> UserThings { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<UserThing>()
      .HasOptional(ut => ut.User)    // See if HasRequired fits your model better
      .WithMany().Map(u => u.MapKey("UserUserName"));
  }
}
3 голосов
/ 18 марта 2011

К сожалению, одна из вещей, которая не попала в этот выпуск, - это возможность добавлять пользовательские соглашения в Code First:

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx

Если вы не хотитечтобы использовать свободный API для настройки имени столбца (в чем я вас не виню), тогда наиболее простой способ сделать это, вероятно, использовать sp_rename .

...