Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何将子模型/表的主键保存为父模型/表中的外键?_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 如何将子模型/表的主键保存为父模型/表中的外键?

Asp.net mvc 如何将子模型/表的主键保存为父模型/表中的外键?,asp.net-mvc,Asp.net Mvc,我正在学习MVC,它是一个ASP.NETMVC项目,用于一个乐谱目录系统,有两个表:ScoreList和KeySignature。KeySignature表具有主键(Id)和KeySignatureName。我有另一个正在使用的表,ScoreListItems,但我认为这个表与我的问题无关 我正在想办法做几件事 1) 当我创建一个新的ScoreList记录时,我希望KeySignature字段是一个下拉列表,用于填充KeySignature表中的keysignatureName 2) 保存记录时

我正在学习MVC,它是一个ASP.NETMVC项目,用于一个乐谱目录系统,有两个表:ScoreList和KeySignature。KeySignature表具有主键(Id)和KeySignatureName。我有另一个正在使用的表,ScoreListItems,但我认为这个表与我的问题无关

我正在想办法做几件事

1) 当我创建一个新的ScoreList记录时,我希望KeySignature字段是一个下拉列表,用于填充KeySignature表中的keysignatureName

2) 保存记录时,我希望ScoreList表存储KeySignatureId

当我写这篇文章的时候,听起来应该很容易,但我整个星期都在挠头,弄不明白。任何帮助都将不胜感激

这就是我到目前为止所做的:

密钥签名模型:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CreswellSolution.Model
{
    public class KeySignature
    {
        public int KeySignatureId { get; set; }
        public string KeySignatureName { get; set; }

    }
}
计分表模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CreswellSolution.Model
{
    public class ScoreList : IObjectWithState
    {
        public ScoreList()
        {
            ScoreListItems = new List<ScoreListItem>();
        }

        public int ScoreListId { get; set; }
        public string ScoreListName { get; set; }
        public string ScoreListComposer { get; set; }
        public int KeySignatureId { get; set; }

        public virtual List<ScoreListItem> ScoreListItems  { get; set; }

        public ObjectState ObjectState { get; set; }
    }
}

首先,确保实体建模正确。它们应该类似于:

public class ScoreList
{
    [Key]
    public int Id { get; set; }

    ...

    [ForeignKey("KeySignature")]
    public int KeySignatureId { get; set; }
    public virtual KeySignature KeySignature { get; set; }
}
然后,在您的操作中,您只需要使用可用的
键签名
选项获得一个
IEnumerable

var keySignatureOptions = db.KeySignatures.Select(m => new SelectListItem
{
    Value = m.Id.ToString(),
    Text = m.Name
});
您可以将其存储在
ViewBag
中,或者最好使用视图模型并将其设置在该视图模型上

那么,在你看来:

@Html.DropDownListFor(m => m.KeySignatureId, (IEnumerable<SelectListItem>)ViewBag.KeySignatureOptions)
取决于你去的方向


就这样。所选值将发回“外键”属性,因此您只需按正常方式保存即可。

非常感谢您的快速响应!我会在几个小时后有机会尝试一下。我用我已有的一些代码更新了我的问题。我使用的是ViewModels——我有一个Helpers类和一个ScoreListViewModel类。如何存储上面提到的keySignatureOptions变量?
var keySignatureOptions = db.KeySignatures.Select(m => new SelectListItem
{
    Value = m.Id.ToString(),
    Text = m.Name
});
@Html.DropDownListFor(m => m.KeySignatureId, (IEnumerable<SelectListItem>)ViewBag.KeySignatureOptions)
@Html.DropDownListFor(m => m.KeySignatureId, Model.KeySignatureOptions)