Навигационные свойства Code-First CTP5 генерируют неправильные имена столбцов - PullRequest
1 голос
/ 28 декабря 2010

У меня есть следующая модель и конфигурация:

public class User
{
    public int Id { get; set; }
    public User CreatedBy { get; set; }
    public DateTime? DateCreated { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        this.HasKey(t => t.Id);

        this.HasOptional(u => u.CreatedBy);
        this.Property(u => u.DateCreated);

        this.Property(u => u.Name).HasMaxLength(64);
        this.Property(u => u.Username).HasMaxLength(64);
    }
}

public class SampleContext : DbContext
{

    public IDbSet<User> Users { get; set; }

    public SampleContext(string dbConnection)
        : base(dbConnection)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
    }
}

Я могу работать с контекстом и просто добавлять пользователей. Затем я посмотрел на таблицу, сгенерированную Code First, и понял, что свойство CreatedBy создает не столбец CreatedById, а столбец UserId. Если я добавлю другое свойство, такое как ModifiedBy, оно сгенерирует UserId1 и так далее:

alt text

Я также пытался сопоставить с HasRequired(), но свойство по-прежнему генерирует имя столбца, соответствующее фактическому типу, а не имя свойства. Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 29 декабря 2010

В основном вы хотите создать независимую ассоциацию с самоопределением с настраиваемым именем столбца внешнего ключа, и вот беглый код API для этого:

public UserConfiguration()
{
    this.HasRequired(u => u.CreatedBy)
        .WithMany()
        .IsIndependent()
        .Map(m => 
        {
            m.MapKey(u => u.Id, "CreatedById");
        });
}

Однако этот код вызывает исключение из-за ошибки в CTP5. Следовательно, в настоящее время вы можете использовать предложенный обходной путь на форуме MSDN (изменив свою независимую ассоциацию на FK-ассоциацию и явно указав свое свойство FK) и сохранить этот код для окончательной первоначальной версии в следующем году.

0 голосов
/ 28 декабря 2010

Вы можете изменить имена столбцов по умолчанию, используя HasColumnName (...)

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
         this.HasKey(t => t.Id);

         this.HasOptional(u => u.CreatedBy);
         // Map the 'DateCreated' Property to the 'CreatedById' table field.
         this.Property(u => u.DateCreated).HasColumnName("CreatedById");

         this.Property(u => u.Name).HasMaxLength(64);
         this.Property(u => u.Username).HasMaxLength(64);
     }
 }
0 голосов
/ 28 декабря 2010

Я пересекаю опубликовал это на форумах MSDN , и я думаю, что это пока что по замыслу. Все навигационные свойства генерируют имя типа + Id для имени столбца. Для меня это фундаментальный недостаток дизайна в коде в первую очередь. Созданные имена даже не отражают столбец (за исключением того, что это пользователь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...