我是stackoverflow的新手!如果我做错了,请原谅我。 我现在已经搜索了几个小时的解决方案,但没有成功...... 背景:
EF模型"角色":
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的键属性的类型。
现在将针对此类问题使用解决方法。
感谢所有贡献者!
答案 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控件一起使用。