gpt4 book ai didi

asp.net-mvc-2 - 难以了解如何在 MVC2/EF4 中处理多对多关系

转载 作者:行者123 更新时间:2023-12-02 20:39:40 25 4
gpt4 key购买 nike

我已经写过几次有关此问题的文章,但仍然很难了解如何使用 EF4 处理 MVC2 中的多对多关系,特别是在创建和编辑功能方面。我认为我的部分问题是我决定以数据透视表在模型本身中不可见的方式创建数据库表。

我的 table ,再次:

Games:
int GameID (primary key, auto-incr)
string GameTitle
string ReviewTitle
int Score
int ReviewContentID (foreign key from Content - News, Articles, and Game reviews all have similar content requirements)
int GenreID (foreign key from Genres)

Platforms:
int PlatformID (primary key, auto-incr)
string Name

GamePlatform (not visible in model):
int GameID (foreign key from Games)
int PlatformID (foreign key from Platforms)

当我创建新评论时,我实际上只想将条目添加到 GamePlatform 数据透视表中,因为我只是尝试将我评论的游戏链接到现有平台。在 OOP 级别处理它让我感到困惑,因为我一直认为我正在添加到平台,而我真正想做的就是将游戏的 id 链接到各种平台 id。

因此,我不想从传入的 HTTP-Post 数据创建新平台。我只是希望能够获取表单数据并创建新游戏、新评论内容,并根据选定的复选框将新游戏链接到现有平台。

我了解如何执行前两项任务。这是我似乎无法理解的联系。

很抱歉继续在这个问题上喋喋不休,但这确实是阻碍我取得重大进展的一件事。

最佳答案

假设您已在 Entity Framework 中正确映射此内容,并且您的 Game 对象具有 Platforms 集合,那么将现有平台分配给游戏应该就像将这些平台的 ID 传递给游戏添加/编辑操作一样简单。

在您的表单中,您可以使用一系列具有 PlatformID 值属性和单个通用名称(例如“platformids”)的复选框。请注意,Html.CheckBox() HtmlHelper 没有“value”参数,因此您必须通过 htmlAttributes 对象来指定它。 MVC 的默认模型绑定(bind)器将通过向接收操作添加匹配参数,自动将表单中的“platformid”值集合分组到单个类型的 IEnumerable 中。

这里有一些代码可以帮助您入门:

// games controller

public action AddGame(Game newGame, int[] platformIds) {
Platforms[] platforms;
if(platFormIds != null && platformIds.Any()) {
platforms = ObjectContext.Platforms.Where(ExpressionExtensions.BuildOrExpression<Platform, int>(p => p.PlatformID, platformIds)).ToList();
}

if(ModelState.IsValid()) {
game.Platforms.AddRange(platforms);

ObjectContext.AddToGames(game);
ObjectContext.SaveChanges();
}
}

// helper class

public static Expression<Func<TElement, bool>> BuildOrExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) {
if (valueSelector == null) throw new ArgumentNullException("valueSelector");
if (values == null) throw new ArgumentNullException("values");

ParameterExpression p = valueSelector.Parameters.Single();

if (!values.Any())
return e => false;

IEnumerable<Expression> equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
Expression body = equals.Aggregate(Expression.Or);

return Expression.Lambda<Func<TElement, bool>>(body, p);
}

注意:上面的 BuildOrExpression() 只是创建 SQL 等价于 SELECT * FROM TABLE WHERE ID IN(1,2,3,4,5,. ..).

关于asp.net-mvc-2 - 难以了解如何在 MVC2/EF4 中处理多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com