使用视图模型:根据 id 分配对象

Using View Model : Assigning an object based on id

我有以下模型 classes 和一个视图模型。我需要将 Option 分配给具有 OptionID 值的对象和 TechnicalCharacteristic 以及 id TCID,即我需要从 TechnicalCharacteristic 中检索特定行,其中 id = TCID,并从 Option 中检索行,其中 id = OptionID。

技术特点

public class TechnicalCharacteristic
{
    public int TechnicalCharacteristicID { get; set; }
    [Display (Name = "Technical Characteristic Name")]
    public string TCName { get; set; }
    [Display (Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display (Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public virtual ICollection<TcSet> TcSets { get; set; }
    //public virtual ICollection<Option> Options { get; set; }
}

选项

public class Option
{
    public int OptionID { get; set;}
    [Display (Name = "Option Type")]
    //[Remote("DuplicateOptionName", "Options", HttpMethod = "POST", ErrorMessage = "Option Name already Exists", AdditionalFields = "")]
    public string OptionName { get; set; }
    [Display (Name ="Description in English")]
    public string DescriptionEN { get; set; }
    [Display(Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public int TechnicalCharacteristicID { get; set; }
    public int LsystemID { get; set; }

    public virtual ICollection<OptionValue> OptionValues { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
    public virtual Lsystem Lsystem { get; set; }
   // public virtual ICollection< SetValue> SetValue { get; set; }
}

期权价值

public class OptionValue
{
    public int OptionValueID { get; set; }
    [Display(Name = "Option Value")]
    public string OptionVal { get; set; }
    [Display (Name="Created By")]
    public string CreatedBy { get; set; }
    [Display(Name = "Created On")]
    public DateTime CreatedOn { get; set; }
    [Display(Name = "Modified By")]
    public string ModifiedBy { get; set; }
    [Display(Name = "Modified On")]
    public DateTime ModifiedOn { get; set; }
    public int OptionID { get; set; }
   // public int SetValueID { get; set; }

    public virtual Option Option { get; set; }
    public virtual ICollection< SetValue> SetValue { get; set; }
}

TcSet

public class TcSet
{
    public int TcSetID { get; set; }
    [Display (Name = "Property name")]
    public string SetName { get; set; }
    [Display(Name = "PhysicalUnit")]
    public string PhysicalUnit { get; set; }
    [Display (Name = "Data Usage")]
    public DataUsage DataUsage { get; set; }
    [Display (Name = "Data Status")]
    public DataStatus DataStatus { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    [Display (Name = "Description in German")]
    public string DescriptionDE { get; set; }
    [Display (Name = "Description in English")]
    public string DescriptionEN { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public int TechnicalCharacteristicID { get; set; }
    public int DataFormatID { get; set; }

    public virtual ICollection<SetValue> SetValues { get; set; }
    public virtual DataFormat DataFormat { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
}

视图模型

public class AddOptionValue
{
    public virtual OptionValue OptionValue { get; set; }
    public virtual SetValue SetValue { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
    public virtual Option Option { get; set; }
    public virtual IEnumerable<TcSet> TcSets { get; set; }
}

控制器

    public ActionResult AddOptionValue (int OptionID, int TCID)
    {
        var viewModel = new AddOptionValue();
        var option = db.Option.Include(x=>x.OptionID).FirstOrDefault(x => x.OptionID == OptionID);
        var tc = db.TechnicalCharacteristic.Include(x => x.TCName).FirstOrDefault(x => x.TechnicalCharacteristicID == TCID);
        var TcSet = db.TechnicalCharacteristic.Include(x => x.TcSets).FirstOrDefault(x=>x.TechnicalCharacteristicID==TCID);
        if(option!=null&&TcSet!=null)
        {
            viewModel.Option = option;
            viewModel.TechnicalCharacteristic = tc;
            viewModel.TcSets = TcSet.TcSets;
        }
        return View(viewModel);
    }

查看

@model TEDALS_Ver01.ViewModels.AddOptionValue
@{
ViewBag.Title = "AddOptionValue";
}

<h2>Add Option Value</h2>

<table>
<tr>
    <th> Option Name</th>
    <th> Technical Characteristic</th>
    <th></th>
</tr>
<tr>
    <td>@Model.Option.OptionName</td>
    <td>@Model.TechnicalCharacteristic.TCName</td>
</tr>
@foreach (var item in Model.TcSets)
{
    <tr>

        <td>item.SetName</td>
    </tr>
}
</table>

我想要达到的目标

A table 我在其中获取 tcSet 中所有元素的列表 TcSet.TechnicalCharacteristicID == TCID.

我在我的代码中尝试了一些变体,但 none 产生了任何结果。

 An exception of type 'System.InvalidOperationException' occurred in EntityFramework.SqlServer.dll but was not handled in user code
 Additional information: A specified Include path is not valid. The EntityType 'TEDALS_Ver01.DAL.Option' does not declare a navigation property with the name 'OptionID'.

是我在线上遇到的错误

 var option = db.Option.Include(x=>x.OptionID).FirstOrDefault(x => x.OptionID == OptionID);    

我不确定 ViewModel 是否是实现相同目标的正确方法。除了列出 TcSet 之外,我还需要为在另一个模型 class 中完成的 TcSet 赋值。

根据您的评论,我认为您不需要 Include(),您只需要提供的 id 值中的选项,您可以将其删除,但如果您想要选项值,请执行以下操作:

var option = db.Option.Include(x => x.OptionValues).FirstOrDefault(x => x.OptionID == OptionID);

或没有 OptionValues:

var option = db.Option.FirstOrDefault(x => x.OptionID == OptionID);