ASP,MVC,EF:如何将POST值从Html.ListBoxFor <t>映射到EF实体导航属性

时间:2015-07-20 08:17:15

标签: c# asp.net asp.net-mvc entity-framework

我是stackoverflow的新手!如果我做错了,请原谅我。 我现在已经搜索了几个小时的解决方案,但没有成功...... 背景:

EF模型&#34;角色&#34;:

public class IdItem {
    [Key]
    public Int32 ID { get; set; }
}
public class NamedItem : IdItem {
    public String Name { get; set; }
}
public class Right : NamedItem {
    ...
}
public class Role : NamedItem {
    /* [1] */ public ICollection<Int32> RightIDs { get; set; } // <-- Key-Collection of Nav-Prop
    /* [2] */ public virtual ICollection<Right> Rights { get; set; } // <-- Nav-Prop
    ...
}

查看&#34; Roles.cshtml&#34;含有:

var sliRights = /* All available Rights as SelectListItem { Value = Right.ID } */
var rightsAtts = new { @class = "form-control selectpicker", multiple = true };
@Html.ListBoxFor(x => x.RightIDs, sliRights, rightsAtts)

这样,所有选定权利的ID都正确地存储在&#34; RightIDs&#34;类的属性&#34;角色&#34;。

问:但是,如何告诉EF映射存储在&#34; RightIDs&#34;中的密钥?同步(反之亦然)将它用于&#34;权利&#34; -Property(见[2])?

我想像[ForeignKey(&#34; RightIDs&#34;)]这样的东西。 [2](试过,不工作)?

更新

例如:

public class Role : NamedItem {
    public ICollection<Int32> RightIDs { get; set; }
    [ForeignKey("RightIDs")] // <-- normally for non-collections, but tried -> not working at all
    public virtual ICollection<Right> Rights { get; set; }
    ...
}

目前,我正在使用类的接口&#34; Role&#34;实现一种方法来读取&#34;权利&#34;进入&#34; RightIDs&#34;以及另一种执行返回方法的方法,都使用DbContext作为参数,由负责的控制器调用:

public interface IScalarEntity {
    void ToScalarProperties(DbContext context);
    void FromScalarProperties(DbContext context);
}

在为至少20个即将到来的实体类使用当前方法时很难看......

修改

正如我现在所研究的那样,没有必要让EF使用ICollection,其中T是基本类型,即使T是一个等于另一个实体Type的键属性的类型。

现在将针对此类问题使用解决方法。

感谢所有贡献者!

1 个答案:

答案 0 :(得分:1)

你在做什么看起来很奇怪。首先,您将数据库逻辑与ViewModel逻辑混合在一起,这是一种不好的做法。当你可以从Right对象获取它们时,你真的需要权利集合的ID吗?

您可以从角色类中删除RightIds属性,并在控制器中使用简单的select语句:

var rights = role.Rights.ToList().Select(r => new SelectListItem
                { 
                   Value = r.ID.ToString(),
                   Text = r.Name 
                });
return View(rights);

现在,在视图中,您将拥有一个带有SelectListItems的模型,您可以将其与Razor中提供的许多List控件一起使用。