Проблема ассоциации EntityFramework CodeFirst FK - PullRequest
1 голос
/ 19 марта 2011

Я пытаюсь заставить CodeFirst работать, и у меня проблема с внешними ключами и связанными объектами.Вероятно, это из-за того, что я не соответствую «условию» и еще не понимаю, как правильно переопределить условные обозначения в моей настройке.Пожалуйста, помогите, если можете.

У меня есть две таблицы в моей существующей базе данных:

create table locations
(
ID int identity primary key
, name varchar(50) not null
)

create table meetings
(
ID int identity primary key
, whatever varchar(50) null
, LocationID int not null constraint FK_meetings_LocationID foreign key references locations(ID)
)

И модели настроены так:

public class Location
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Meeting> Meetings { get; set; }
}

public class Meeting
{
    public int ID { get; set; }
    public string Whatever{ get; set; }
    public Location HeldAt { get; set; }
}

Наконецмой контекст настроен так:

public class v1Context : DbContext
{
    public v1Context(string ConnectionString)
        : base(ConnectionString)
    {}

    public DbSet<Location> Locations { get; set; }
    public DbSet<Meeting> Meetings { get; set; }

    //protected override void OnModelCreating(DbModelBuilder modelBuilder)
    //{
    //    modelBuilder.Entity<Location>().HasKey(k => k.ID);
    //    modelBuilder.Entity<Meeting>().HasKey(k => k.ID);
    //}
}

И я получаю следующую ошибку "Произошла ошибка при выполнении определения команды. Подробности смотрите во внутреннем исключении" .. С InnerExceptin of:

InnerException = {"Invalid column name 'HeldAt_ID'."}

Я пробовал различные заклинания OnModelCreating, но безуспешно.Кажется очевидным, что проблема в том, что он не знает, как правильно перемещать FK «LocationID» к классу Location с его полем ID.Но я не смог выяснить это.

Каким-то образом я подумал, что, поскольку он имеет тип «Location» и что класс Location также независимо сопоставляется с базой данных, и потому что существуют правильные отношения FKв базе данных, это будет просто "выяснить это".

Любая помощь будет принята с благодарностью.

1 Ответ

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

Вы не используете имена по умолчанию для столбцов, поэтому вы должны указать их в OnModelBuilding:

Используйте это для определения LocationID в качестве столбца внешнего ключа вместо ожидаемого по умолчанию HeldAt_ID:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Meeting>()
        .HasRequired(m => m.HeldAt)
        .WithMany(l => l.Meetings)
        .Map(m => m.MapKey("LocationID"));
}
...