我有两个表(NPG_Chemical和NPG_Chemical_Synonym):
public partial class NPG_Chemical
{
[Key]
[Column(TypeName = "numeric")]
public decimal NPG_Chemical_ID { get; set; }
[StringLength(256)]
public string Chemical { get; set; }
}
public partial class NPG_Chemical_Synonym
{
[Key]
[Column(TypeName = "numeric")]
public decimal NPG_Chemical_Synonym_ID { get; set; }
[ForeignKey("NPG_Chemical_ID")]
[Column(TypeName = "numeric")]
public decimal NPG_Chemical_ID { get; set; }
[StringLength(512)]
public string Synonym { get; set; }
}在NPG_ChemicalController中,我有如下内容:
[HttpPost]
public ActionResult Create(NPG_ChemicalViewModel model)
{
using (var context = new NPG_Model())
{
var chemical = new NPG_Chemical();
chemical.Chemical = model.NPG_Chemical.Chemical;
context.NPG_Chemical.Add(chemical);
var synonym = new NPG_Chemical_Synonym();
synonym.Synonym = model.NPG_Chemical_Synonym.Synonym;
synonym.NPG_Chemical_ID = chemical.NPG_Chemical_ID;
context.NPG_Chemical_Synonym.Add(synonym);
context.SaveChanges();
}
return View();
}和NPG_ChemicalViewModel:
namespace NPG_Administrative_Utility.Models
{
public class NPG_ChemicalViewModel
{
public NPG_ChemicalViewModel()
{
NPG_Chemical = new NPG_Chemical();
NPG_Chemical_Synonym = new NPG_Chemical_Synonym();
}
public NPG_Chemical NPG_Chemical { get; set; }
public NPG_Chemical_Synonym NPG_Chemical_Synonym { get; set; }
}
}当我尝试创建基于NPG_ChemicalViewModel的视图时,它显示:

有人能帮我吗?
发布于 2015-11-30 18:21:37
你需要一个视图模型。最简单的情况是,您只需做以下事情:
public class NPG_ChemicalViewModel
{
public NPG_ChemicalViewModel()
{
NPG_Chemical = new NPG_Chemical();
NPG_Chemical_Synonym = new NPG_Chemical_Synonym();
}
public NPG_Chemical NPG_Chemical { get; set; }
public NPG_Chemical_Synonym NPG_Chemical_Synonym { get; set; }
}然后,更改您的操作以接受以下操作:
public ActionResult Create(NPG_ChemicalViewModel model)在您的视图中,您将生成以下各个属性:
@Html.EditorFor(m => m.NPG_Chemical.Chemical)但是,最好只在视图模型中包含您想要编辑的属性:
public class ChemicalViewModel
{
public string Chemical { get; set; }
public string Synonym { get; set; }
}然后,在您的操作中,您只需将这些已发布的数据映射到它应该去的地方:
var chemical = new NPG_Chemical();
chemical.Chemical = model.Chemical;
context.NPG_Chemical.Add(chemical);
var synonym = new NPG_Chemical_Synonym();
synonym.Synonym = model.Synonym;
synonym.NPG_Chemical_ID = chemical.NPG_Chemical_ID;
context.NPG_Chemical_Synonym.Add(synonym);也就是说,这里的代码有一些重要的问题。首先,看起来你在处理化学和同义词之间的一对一或一对多的关系,但是现在,你没有外键被使用。应该向同义词类添加一个导航属性:
[ForeignKey("NPG_Chemical_ID")]
public NPG_Chemical Chemical { get; set; }这告诉实体框架,您有关系,除其他外,允许它在必要时自动填写in。例如,有了它,您现在可以简单地做:
synonym.Chemical = chemical;而不是直接引用ID。这样,如果id在保存之前是自动生成的或未知的,则关系仍将保留。但是,如果没有它,您必须首先保存chemical,在synonym上设置自动生成的id,然后将synonym保存在单独的事务中。
第二,如果要使用键入为“数字”的键。然后,您将负责为每个记录生成一个唯一的数字字符串。这是一个巨大的痛苦,因为在实际保存之前,需要检查建议的id与其他现有的记录id。否则,您将面临主键冲突的风险。最好是使用标准的自动递增PK,或者禁止至少是GUID,其中确保发生碰撞的风险相当低。
第三,您应该绝对不要在上下文中使用using。这里没有什么大不了的,因为您只是在保存而不是从数据库中读取数据,但是在典型的视图中,延迟加载会让您在后面快速完成这些操作。您的上下文应该是请求范围的,或者作为控制器上的一个实例变量(因为控制器是用每个请求更新和处理的),或者使用依赖注入。您永远不希望在任何其他地方创建上下文实例,包括操作方法。
https://stackoverflow.com/questions/34004267
复制相似问题