Настройка модели MVC3 - Code First EF - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь создать список поездок на поезде (между прочим) в MVC, используя сначала код Entity Framework и интересуясь, как я могу отобразить внешние ключи для станций.Модель / таблица Journey будет иметь DepartureStationID и ArrivalStationID, которые будут внешними ключами, связывающими одну таблицу / модель с именем Station.

. Вот код для обеих этих моделей:

public class Station
{        
    public int StationID { get; set; }
    public string StationName { get; set; }
    public string StationLocation { get; set; }
}

public class Journey
{
    public int JourneyID { get; set; }
    public int DepartureID { get; set; }
    public int ArrivalID { get; set; }
    public int OperatorID  { get; set; }
    public string JourneyCode { get; set; }

    public virtual Operator Operator { get; set; }
    public virtual Station DepartureStation { get; set; }   
    public virtual Station ArrivalStation { get; set; }    
}

Там есть еще одно значение внешнего ключа, а именно Operator, которое успешно сопоставлено, но отправления и прибытия не имеют, и возвращают нулевые значения в представлении: (@Html.DisplayFor(modelItem => item.DepartureStation.StationName).
Когда я посмотрел в базе данных, EF создал два дополнительных поля:

DepartureStation_StationID
ArrivalStation_StationID

И отношение SQL было между таблицей станций и двумя полями выше, а не DepartureID и ArrivalID

Итак, мой вопрос: нужно ли делать что-то другое в модели при обращении к одной и той же таблице для двух полей?Я не знаю, почему были добавлены эти дополнительные поля, поэтому я предполагаю, что настроил модель неправильно.

Спасибо

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Для полноты, то же самое можно сказать и о плавной конфигурации.

public class MyDb : DbContext
{
    public DbSet<Journey> Journeys { get; set; }
    public DbSet<Operator> Operators { get; set; }
    public DbSet<Station> Stations { get; set; }

    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Entity<Journey>()
            .HasRequired(j => j.DepartureStation)
            .WithMany()
            .HasForeignKey(j => j.DepartureID);

        builder.Entity<Journey>()
            .HasRequired(j => j.ArrivalStation)
            .WithMany()
            .HasForeignKey(j => j.ArrivalId);

        // ... Same thing for operator ...

        base.OnModelCreating(builder);
    }
}

Редактировать: чтобы ответить на ваш комментарий касательно удаления каскада, вы можете добавить .WillCascadeOnDelete(false) после .HasForeignKey(), и это может помочьхотя тогда вам придется удалять записи о поездках вручную)

3 голосов
/ 21 ноября 2011

Добавьте следующие атрибуты в свои свойства навигации:

public class Journey
{
    public int JourneyID { get; set; }
    public int DepartureID { get; set; }
    public int ArrivalID { get; set; }
    public int OperatorID  { get; set; }
    public string JourneyCode { get; set; }

    [ForeignKey("OperatorID")]
    public virtual Operator Operator { get; set; }
    [ForeignKey("DepartureID")]
    public virtual Station DepartureStation { get; set; }
    [ForeignKey("ArrivalID")]
    public virtual Station ArrivalStation { get; set; }
}

И, конечно, вам необходимо восстановить базу данных, чтобы применить новую конфигурацию.

Надеюсь, это поможет.

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