EF4 Code-First CTP5 Многие к одному

Я пытался заставить EF4 CTP5 хорошо работать с существующей базой данных, но столкнулся с некоторыми основными проблемами сопоставления.

У меня пока есть два модельных класса:

public class Job
{
    [Key, Column(Order = 0)]
    public int JobNumber { get; set; }
    [Key, Column(Order = 1)]
    public int VersionNumber { get; set; }

    public virtual User OwnedBy { get; set; }
}

и

[Table("Usernames")]
public class User
{
    [Key]
    public string Username { get; set; }

    public string EmailAddress { get; set; }

    public bool IsAdministrator { get; set; }
}

И у меня есть класс DbContext, выставляющий их как IDbSet

Я могу запрашивать своих пользователей, но как только я добавил поле OwnedBy в класс Job, я начал получать эту ошибку во всех моих тестах для Jobs:

Недопустимое имя столбца «UserUsername».

Я хочу, чтобы это вело себя как NHibernate «многие к одному», тогда как я думаю, что EF4 рассматривает его как сложный тип. Как это сделать?


person Kevin McKelvin    schedule 01.01.2011    source источник


Ответы (2)


UserUsername — это имя по умолчанию, которое EF Code First выбирает для внешнего ключа в таблице Jobs. Очевидно, это не то же самое имя, которое ваша существующая база данных имеет для столбца FK в таблице Jobs. Вам необходимо переопределить это соглашение и изменить имя FK по умолчанию, чтобы оно соответствовало вашей базе данных. Вот как это делается с помощью Fluent API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Job>()
                .HasOptional(j => j.OwnedBy)
                .WithMany()
                .IsIndependent()
                .Map(m => m.MapKey(u => u.Username, "TheFKNameInYourDB"));
}
person Morteza Manavi    schedule 01.01.2011
comment
Это создает исключение, объявляющее: Sequence contains more than one matching element. Какие-либо предложения? - person Luis Aguilar; 14.04.2011

Попробуйте создать новую базу данных из вашей схемы и посмотрите, какое имя столбца она ожидает.

Я думаю, что это передний ключ для OwnedBy. Он пытается назвать его в соответствии со своим внутренним соглашением, которое несовместимо с тем, как вы назвали свой столбец внешнего ключа. И нет, на самом деле это рассматривается как «многие к одному».

person Euphoric    schedule 01.01.2011