Я использую MVC3 и EF4, но при попытке сохранить сущность с отношениями внешних ключей у меня возникла небольшая проблема.
Вот мои модели (сокращены для экономии места)
public class MenuItem
{
/// <summary>
/// The ID
/// </summary>
[Key]
public int MenuItemID { get; set; }
/// <summary>
/// Foreign key to menu item category
/// </summary>
public int MenuItemCategoryID { get; set; }
/// <summary>
/// The item category
/// </summary>
public MenuItemCategory MenuItemCategory { get; set; }
}
public class MenuItemCategory
{
/// <summary>
/// The ID
/// </summary>
[Key]
public int MenuItemCategoryID { get; set; }
/// <summary>
/// The name
/// </summary>
[Required]
[DataType(DataType.Text), StringLength(128)]
public string Name { get; set; }
}
Тогда у меня есть этот метод в моем хранилище, который сохраняет MenuItems:
public void CreateMenuItem(MenuItem menuItem)
{
MissChuDataContext.MenuItems.Add(menuItem);
MissChuDataContext.SaveChanges();
}
Мое сопоставление базы данных:
modelBuilder.Entity<MenuItem>().HasRequired(x => x.MenuItemCategory).WithMany().HasForeignKey(x => x.MenuItemCategoryID);
Однако по какой-то причине метод репо создает дублирующиеся объекты MenuItemCategory при сохранении нового MenuItem, связанного с существующей MenuItemCategory.
Мне удалось заставить его работать, переназначив MenuItemCategory из контекста в контроллере:
[HttpPost]
public ActionResult CreateMenuItem(MenuItem menuItem)
{
menuItem.MenuItemCategory = MenuItemRepository.GetMenuItemCategoryByID(menuItem.MenuItemCategory.MenuItemCategoryID);
MenuItemRepository.CreateMenuItem(menuItem);
return View();
}
Это работает и не создает дубликат MenuItemCategory, однако я уверен, что мне не хватает чего-то простого, что предотвратит дублирование, и мне не придется использовать вызов menuItem.MenuItemCategory = ... в контроллере.
Посмотрел ВЕЗДЕ, но пока не нашел ничего, что работает: (
Большое спасибо!