【问题标题】:EF4 + Poco = Problem Updating many to many relationshipsEF4 + Poco = 更新多对多关系的问题
【发布时间】:2011-06-18 23:57:12
【问题描述】:

让我解释一下整个上下文:

我正在使用 ASP.NET MVC 2、EF4 (POCO)。

我尝试为我的应用创建一个通用存储库

我在更新 多对多关系时遇到问题

我有一个通过多对多表与其他项目相关的项目。在视图中,用户选择所需的类别,并将选择的 id 发送给控制器。

然后,Controller 查询 Category Repository,将其添加到主项:

item.Categories.Add(CategoriesRepository.Single(id);

但是,当我去存储库并尝试像这样保存时:

 Entities.ApplyCurrentValues(entity);
 Context.SaveChanges();

但是,我的实体的状态是Added

然后,我无法保存我的实体 :(.

我该如何解决这个问题?


感谢您的回答。

我在View里有如下代码:

 <%= Html.CheckBoxList("Categories", ((IEnumerable<Categories>)ViewData["Categories"]).ToDictionary(c => c.ID.ToString(), c => c.Name)
                                , Model.Categories.ToDictionary(c => c.ID.ToString(),c => c.Name )) %>

CheckBoxList 是一个 HTMLHelper。

我将 id 作为值放入视图中,因为我不知道其他方式可以放置然后从视图中获取此信息。

如何使用ObjectStateManager.ChangeRelationshipState 方法?

像这样? :

itemRepository.Db.ObjectStateManager.ChangeRelationshipState(item, item.Categories, "Categories", System.Data.EntityState.Modified);

我尝试这种方式,但它返回错误。

帮助!哈哈

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-2 entity-framework-4 many-to-many poco


【解决方案1】:

你遇到了一些问题。

1) ApplyCurrentValues 仅适用于 scalar-properties。由于您尝试将Category 添加到Item 上的Categories 导航属性,因此这将不起作用。

2) 你这样说:

用户选择所需的类别,然后只将选择的 id 发送到控制器。

您的控制器如何接受一堆 id?这个模型绑定是如何完成的?我们需要更多关于您的视图如何绑定到您的模型、传递给操作方法的信息。但听起来您需要借助 ViewModel 重新设计这个特定的 View。

3) 在 MVC 中使用 POCO 进行更改跟踪是一件令人头疼的事情。在您的场景中,您需要使用 ObjectStateManager.ChangeRelationshipState 手动将 Categories 关系设置为 **Modified。

虽然诚实,但它比它的价值更痛苦。我遇到了同样的问题。

把它放在下巴上 - 先抓住实体并使用Controller.UpdateModel

[HttpPost]
public ActionResult Item(Item item)
{
   // get the existing item
   var existingItem = ItemRepository.Single(item.Id);

   // use MVC to update the model, including navigational properties
   UpdateModel(existingItem);

   // save changes.
   Context.SaveChanges();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多