.NET EF4 дублирующие сущности при сохранении - PullRequest
0 голосов
/ 02 августа 2011

Я использую 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 = ... в контроллере.

Посмотрел ВЕЗДЕ, но пока не нашел ничего, что работает: (

Большое спасибо!

1 Ответ

0 голосов
/ 02 августа 2011

Попробуйте это:

public void CreateMenuItem(MenuItem menuItem)
{
    MissChuDataContext.MenuItems.Add(menuItem);
    MissChuDataContext.Entry(menuItem.MenuItemCategory).State = EnttiyState.Unchanged;
    MissChuDataContext.SaveChanges();
}

Проблема в том, что при вызове Add EF добавляет все объекты в графе объектов, а не только menuItem. Вы должны всегда вручную обрабатывать состояние всех сущностей, присоединенных или добавленных к вашему контексту, если вы не загружаете их одним и тем же экземпляром контекста, прежде чем вносить какие-либо изменения.

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