【问题标题】:ASP.Net MVC - how to save and retrieve data from two tables in one databaseASP.Net MVC - 如何从一个数据库中的两个表中保存和检索数据
【发布时间】:2018-08-20 02:57:20
【问题描述】:

我想要达到的效果是这样的:

  1. 在视图中填写表格
  2. 将数据保存到带有列的table1中:

    Id|OperationNumber|Name|ContactNo
    

    table1 Id 是主键

  3. 将数据保存到带有列的table2中:

    ReferenceId|OperationNumber
    

    ReferenceId是数据类型uniqueidentifier的主键

两个表中的“OperationNumber”列是相关的。当数据保存在table1中时,OperationNumber也会连同自动生成的ReferenceId(uniqueidentifier)一起保存在table2中

检索过程是:

  1. 输入ReferenceId作为搜索
  2. 在结果视图中显示 table1 和 table2 中的所有详细信息

这就是我的问题,如何在两个表中保存和检索数据?

这是我目前拥有的:

控制器:

public ActionResult Create()
{
     return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(RefViewModel myViewModel)
{
     db.Table1.Add(myViewModel.Ref);
     db.SaveChanges();
     return RedirectToAction("Index");
}

型号:

public class RefViewModel
{
     public Table1 Ref { get; set; }
     public string OperationNumber { get; set; }
     public string Name { get; set; }
     public string ContactNo { get; set; }
}

以上代码中只能保存在table1中。那我该怎么做才能保存两张表呢?

(哦,顺便说一句。您可能已经注意到“绑定(包括=”无处可去,我已禁用它,因为在保存到数据库时我得到空值。所以,无论如何。这不再是问题了。只是提到)

数据库是 SQL Server

编辑:关于检索数据

搜索控制器:

public ActionResult Search(string searchString)
{
     var myRef = (from x in db.Table1
                  where x.OperationNumber.Contains(searchString)
                  select x).FirstOrDefault();
     return View(myRef);
}

当我输入operationnumber 时返回详细信息。所以问题是当我只输入referenceId时如何从两个表中检索详细信息?

【问题讨论】:

  • 您使用哪种方法以当前方式保存?要检索 2 个或更多表中的详细信息,请使用 joinequals 到外键字段,例如from x in db.Table1 join y in db.Table2 on x.referenceId equals y.referenceId where ... select ....
  • 或者..您可以在数据库上创建一个视图...将其添加到您的 EF 模型中并将视图结果作为模型返回

标签: sql-server asp.net-mvc


【解决方案1】:

您可以通过使用存储过程轻松地做到这一点。定义两个属性类来表示两个表,使用继承如下。

public class Tablel
{
     public string ID { get; set; }
     public string OperationNumber { get; set; }
     public string Name { get; set; }
     public string ContactNo { get; set; }
}

public class Table2 extend Table1
{
     public string ReferenceID { get; set; }
     public string OperationNumber { get; set; }

}

现在您可以使用存储过程来保存和检索数据库中的数据。从数据库中检索数据时使用连接,将数据保存到两个表时可以使用两个单独的查询。

【讨论】:

  • 你的意思是,“将数据保存到两个表时使用两个单独的查询”?我如何在控制器中做到这一点
  • 这就是我们使用存储过程的原因。您可以执行存储过程,并在 SP 中编写两个查询。
【解决方案2】:

来自DbContext.SaveChanges()的c#元数据:-

返回: // 写入底层数据库的对象数。

所以基本上你会做这样的事情:-

public ActionResult Create(RefViewModel myViewModel)
{
     db.Table1.Add(myViewModel.Ref);
     var t1 = db.SaveChanges();

     Table2 t2 = new Table2
     {
        OperationNumber = t1.OperationNumber
     };

     db.Table2.Add(t2);
     db.SaveChanges();

     return RedirectToAction("Index");
}

调用 SaveChanges 时,它会返回保存到数据库中的所有对象,因此当您第一次调用 SaveChanges 时,它将返回一个 Table1 对象,您将使用该 Table1 对象填充 Table2 的 OperationNumber 属性并调用 SaveChanges再次。

【讨论】:

    【解决方案3】:

    如果您的操作编号是唯一的,则在存储过程中使用此查询,您可以使用 ReferenceID 找到数据

    Select * from table1 t1 
    inner join table2 t2 on t1.OperationNumber = t2.OperationNumber
    where t2.ReferenceID = @pReferenceID
    

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 1970-01-01
      • 2015-09-10
      • 2018-10-16
      • 2010-12-08
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多