簡體   English   中英

ASP,MVC,EF:如何從Html.ListBoxFor映射POST值 <T> EF實體導航屬性

[英]ASP, MVC, EF: How to map POST values from Html.ListBoxFor<T> to EF Entity Navigation Property

我是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
    ...
}

查看“ Roles.cshtml”,其中包含:

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都會正確存儲在類“角色”的“ RightIDs”屬性中。

問:但是,如何告訴EF映射存儲在“ RightIDs”中的密鑰,使其與“ Rights” -Property同步使用(反之亦然)(請參見[2])?

我猜像[ForeignKey(“ RightIDs”)]]這樣。 為[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; }
    ...
}

當前,我正在使用類“ Role”的接口,該接口實現了一種方法,將所有“ ID”從“ Rights”讀取為“ RightIDs”,以及另一種執行返回的方法,均使用DbContext作為參數,由負責的控制器調用:

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

在將這種當前方法用於至少20個即將到來的實體類時,很難看...

編輯

正如我現在所研究的那樣,即使T是等於另一個實體Type的鍵屬性的類型,也沒有必要讓EF使用T為原始類型的ICollection。

現在,將解決方法用於此類問題。

感謝所有貢獻者!

你在做什么看起來很奇怪。 首先,您將數據庫邏輯與ViewModel邏輯混合在一起,這是一種不好的做法。 當您可以從Right對象中獲取ID時,您真的需要ID來收集權限嗎?

您可以從Role類中刪除RightIds屬性,並在控制器中使用簡單的select語句:

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

現在,在視圖中,您將擁有一個帶有SelectListItems的模型,您可以將其與Razor中的許多List控件一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM