首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC:如何将数据插入多个表?

ASP.NET MVC:如何将数据插入多个表?
EN

Stack Overflow用户
提问于 2015-11-30 17:19:15
回答 1查看 1.9K关注 0票数 1

我有两个表(NPG_Chemical和NPG_Chemical_Synonym):

代码语言:javascript
复制
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中,我有如下内容:

代码语言:javascript
复制
    [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:

代码语言:javascript
复制
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的视图时,它显示:

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 18:21:37

你需要一个视图模型。最简单的情况是,您只需做以下事情:

代码语言:javascript
复制
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; }
}

然后,更改您的操作以接受以下操作:

代码语言:javascript
复制
public ActionResult Create(NPG_ChemicalViewModel model)

在您的视图中,您将生成以下各个属性:

代码语言:javascript
复制
@Html.EditorFor(m => m.NPG_Chemical.Chemical)

但是,最好只在视图模型中包含您想要编辑的属性:

代码语言:javascript
复制
public class ChemicalViewModel
{
    public string Chemical { get; set; }
    public string Synonym { get; set; }
}

然后,在您的操作中,您只需将这些已发布的数据映射到它应该去的地方:

代码语言:javascript
复制
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);

也就是说,这里的代码有一些重要的问题。首先,看起来你在处理化学和同义词之间的一对一或一对多的关系,但是现在,你没有外键被使用。应该向同义词类添加一个导航属性:

代码语言:javascript
复制
[ForeignKey("NPG_Chemical_ID")]
public NPG_Chemical Chemical { get; set; }

这告诉实体框架,您有关系,除其他外,允许它在必要时自动填写in。例如,有了它,您现在可以简单地做:

代码语言:javascript
复制
synonym.Chemical = chemical;

而不是直接引用ID。这样,如果id在保存之前是自动生成的或未知的,则关系仍将保留。但是,如果没有它,您必须首先保存chemical,在synonym上设置自动生成的id,然后将synonym保存在单独的事务中。

第二,如果要使用键入为“数字”的键。然后,您将负责为每个记录生成一个唯一的数字字符串。这是一个巨大的痛苦,因为在实际保存之前,需要检查建议的id与其他现有的记录id。否则,您将面临主键冲突的风险。最好是使用标准的自动递增PK,或者禁止至少是GUID,其中确保发生碰撞的风险相当低。

第三,您应该绝对不要在上下文中使用using。这里没有什么大不了的,因为您只是在保存而不是从数据库中读取数据,但是在典型的视图中,延迟加载会让您在后面快速完成这些操作。您的上下文应该是请求范围的,或者作为控制器上的一个实例变量(因为控制器是用每个请求更新和处理的),或者使用依赖注入。您永远不希望在任何其他地方创建上下文实例,包括操作方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34004267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档