Обычно я полностью ориентируюсь на модель при работе со своими сущностями.Не зная, как вы определяете свои отношения сущностей, я пойду с CodeFirst.
Классы
Пользователь
[Table("tblUsers")]
class User
{
public int ID { get; set; }
public string Name { get; set; }
public int CountryID { get; set; }
[ForeignKey("CountryID")]
public virtual Country Country { get; set; }
}
Страна
[Table("tblCountries")]
public class Country
{
public int ID { get; set; }
public string Name { get; set; }
public static Country Find(MyContext db, int id)
{
return db.Countries.Find(id);
}
public static Country Find(MyContext db, string CountryName)
{
var matches = from c in db.Countries where c.Name == CountryName select c;
if (matches.Count() > 0)
{
return matches.First();
}
else
{
return null;
}
}
}
Контекст
class MyContext : DbContext
{
public MyContext () : base()
{
}
public DbSet<User> Users { get; set; }
public DbSet<Country> Countries { get; set; }
}
Беспорядок с этими данными
public void Main()
{
MyContext db = new MyContext();
Country Canada = Country.Find(db, "Canada");
var users = from u in db.Users select u;
foreach (User u in users)
{
u.Country = Canada;
}
db.SaveChanges();
}
Таким образом, Entity Framework может выполнять работу по настройке эталонных значений, все, о чем вам нужно беспокоиться - это работать с конкретными объектами.
Опять же, я не знаю, какую форму принимают ваши сущности, но Entity Framework работает в основном равномерно между своими воплощениями.
Отображение раскрывающегося списка должно быть довольно простым.Недавно я делал нечто подобное в приложении MVC со списком (я пишу об объектах Country, но в моем примере я работаю с оператором телефонной связи).Я создал класс ViewModel, который будет содержать мою запись пользователя, а также список SelectList, который содержит список всех стран, TextValue (countryName) и DataValue (CountryID) и функцию, чтобы определить, должен ли быть выбран какой-либо конкретный элемент насписок.Это выглядит примерно так:
ViewModel
public class UserProfileViewModel
{
public UserProfileViewModel()
{
AllCarriers = new AspAppServicesContext().Carriers.ToList();
selCarrier = new SelectList(AllCarriers, "ID", "Name", null);
}
public UserProfileViewModel(RegisterModel profile)
{
this.MyProfile = profile;
AllCarriers = new AspAppServicesContext().Carriers.ToList();
selCarrier = new SelectList(AllCarriers, "ID", "Name", this.MyProfile.CarrierID);
}
public RegisterModel MyProfile { get; set; }
public List<Carrier> AllCarriers { get; set; }
public SelectList selCarrier { get; set; }
public object SelectedCarrier { get; set; }
}
Пример ListBox
<div class="editor-label">
@Html.LabelFor(m => m.CarrierID)
</div>
<div class="editor-field">
@Html.ListBox("SelectedCarrier", Model.selCarrier)
</div>
В этом примере на выходной странице будет список со списком, имя которого - SelectedCarrier, икаждый элемент в списке будет выглядеть примерно так:
<option value="1">Canada Telecom</option>
Значение - это идентификатор, а Canada Telecom - это имя оператора, которое отображается в списке.При отправке массив строк возвращается свойству SelectedCarrier (имя списка) в ViewModel, чтобы выполнить то, что вы хотите.В моем случае я использовал следующее на своем контроллере, чтобы внести изменения в профиль пользователя:
if (model.SelectedCarrier != null)
{
string[] SelectedCarrier = (string[])model.SelectedCarrier;
profile.CarrierID = int.Parse(SelectedCarrier[0]);
}
profile.Save();