2013-06-18 5 views
0

У меня есть класс, Rate который может иметь два расположения; LocationTo и LocationFrom. Места размещения должны быть раскрывающимся списком на странице.Entity framework модель класса навигации свойство

Мои модели выглядят так:

public class Rate 
{ 
    [Key] 
    public int Id { get; set; } 
    public string RateName { get; set; } 
    public int LocationToId { get; set; } 
    public int LocationFromId { get; set; } 
    public virtual Location LocationTo { get; set; } 
    public virtual Location LocationFrom { get; set; } 
} 

public class Location 
{ 
    [Key] 
    public int Id { get; set; } 
    public string LocationName { get; set; } 
    public virtual ICollection<Rate> Rates { get; set; } 
} 

я думаю правильно здесь?


это право охлин? что делает общедоступным виртуальное местоположение LocationTo {get; задавать; } делать?

public class Location 
{ 
    [Key] 
    public int Id { get; set; } 
    public string LocationName { get; set; } 
    [InverseProperty("LocationToId")] 
    public virtual ICollection<Rate> ToRates { get; set; } 
    [InverseProperty("LocationFromId")] 
    public virtual ICollection<Rate> FromRates { get; set; } 
} 
public class Rate 
{ 
    [Key] 
    public int Id { get; set; } 
    public string RateName { get; set; } 
    public int LocationToId { get; set; } 
    public int? LocationFromId { get; set; } 
    public virtual Location LocationTo { get; set; } 
    public virtual Location LocationFrom { get; set; } 
} 
public class dc : DbContext 
{ 
    public DbSet<Location> Locations { get; set; } 
    public DbSet<Rate> Rates { get; set; } 

} 
+0

Да, что работает. – SOfanatic

+0

Вы пробовали это перед публикацией? Есть что-то не так, как вы ожидали? – Jay

+0

Я не уверен, что вам нужно 'public virtual ICollection Тарифы {get; задавать; } ', поскольку он выглядит как односторонняя ассоциация ** из **' Rate'. – qujck

ответ

1

Одна из проблем, с вашей моделью является то, что у вас есть две ссылки на местоположение для каждой ставки, и вы должны помочь EF вне немного, добавив некоторые атрибуты. Имя по умолчанию для иностранного идентификатора в классе Rate должно быть LocationId, но у вас есть две ссылки и, следовательно, необходимо предоставить им отдельные имена. Ничего плохого в том, что ...

Но вы должны немного изменить в Location модели:

public class Location 
{ 
    [Key] 
    public int Id { get; set; } 
    public string LocationName { get; set; } 
    [InverseProperty("LocationToId")] 
    public virtual ICollection<Rate> ToRates { get; set; } 
    [InverseProperty("LocationFromId")] 
    public virtual ICollection<Rate> FromRates { get; set; } 
} 

Добавляя InverseProperty атрибут EF может найти путь от места к Оценить

Редактировать: Пример выпадающего списка

Хорошо, вопрос немного изменился :-) Чтобы добавить выпадающие списки, вы можете написать таким образом.

@model Rate 
@Html.DropDownListFor(model => model.LocationFromId, ((IEnumerable<Location>)ViewBag.PossibleLocations).Select(option => new SelectListItem { 
    Text = Html.DisplayTextFor(_ => option).ToString(), 
    Value = option.Id.ToString(), 
    Selected = (Model != null) && (option.Id == Model.LocationFromId) 
}), "Choose...") 

Что вам нужно сделать, чтобы сделать эту работу, чтобы создать переменную PossibleLocations в ViewBag в контроллере, прежде чем перейти к View.

+0

Я провешу этот Ohlin и вернитесь к вам как можно скорее! – Gmorken

+0

ok, когда я запустил это, я получу ошибку sayin «Представление ограничения FOREIGN KEY может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY» – Gmorken

+0

Это потому, что у вас есть два ссылки на местоположение. Определите один из них 'int?' Вместо 'int', и он должен работать лучше. – Ohlin

Смежные вопросы