使用实体框架中的一个存储过程插入到两个表中

本文关键字:插入 两个 存储过程 一个 实体 框架 | 更新日期: 2023-09-27 18:31:26

在实体框架 4 中,我的数据库模型中有两个表(我们称它们为 InfoData )映射到实际的数据库表。在Info表中,有一个DataId列将两个表链接在一起(表始终为 1:1)。

表中的重要列包括:

信息

  • 编号
  • DataId => 指向 Data.id 的链接
  • 属性1
  • 属性2

数据

  • id => 链接到 Info.DataId
  • 目录
  • 属性1

我编写了一个存储过程来插入数据。此过程首先在Data中插入一行(以便我可以获取Data.id值),然后在Info中插入一行。当我调用 context.SaveChanges() 时,它会在代码中调用。

我将这个存储过程设置为在XmlDataInfo上完成插入时运行,因为它包含除Data.Xml之外的过程所需的所有字段。

由于Data.Xml在不同的表中,我遇到了两个问题......

  1. 如果我不设置/更改Data.XmlINSERT将正确运行我的存储过程。当我设置该值时,实体框架也会尝试在Data表上执行插入。我只希望它运行我的存储过程调用(在Info表上),该调用插入到两个表中。我需要设置Data.Xml因为我的过程需要这个值,所以我不能让它为 NULL。

  2. 我不知道如何在存储过程映射中设置Data.Xml值。它不允许我选择要在属性下拉列表中使用的属性的子元素。

我看到了一些在代码中Info创建分部类的建议,我可以这样做以在代码中访问此属性,但该分部类属性在模型上不可用,所以我仍然无法选择它作为映射属性。


这就是我的问题。我还没有用 EF 做很多事情,所以也许我错过了什么或做错了。

似乎应该有某种方法可以在 Info 上映射一个可以获取/设置Data.Xml的字段,然后调用我的程序,而无需尝试在Data表上进行插入。我希望我可以向 Info 模型添加某种纯代码属性,我可以使用该属性来获取此值,但是我找不到一种方法来执行此操作,因为它可以在存储过程映射中访问。

使用实体框架中的一个存储过程插入到两个表中

很难确切地说出你在这里想做什么。 我认为您可能不完全了解 EF 或应如何调用存储过程。

需要注意的几点: 1. 存储过程应负责插入到两个表中。 从 C# 代码(通过 EF)调用它时,应该无法判断要插入到哪些表中。 2. 如果您打算读取/写入数据,您的实体应包含这两个表。 如果在实体中包含Data,EF 应自动创建用于写入的属性Data.Xml

现在,让我们假设你所有的表列都是 varchars(字符串),除了你的 id 是 PK(整数)。 存储过程原型如下所示:

int MyStoredProcedure(string dataProperty1, string infoProperty1, string infoProperty2)

当你从 C# 调用此函数,然后从 SaveChanges() 调用此函数时,存储过程会将字符串插入到表中,并将插入到Data表中的记录的 PK (int) 返回给您。 现在,您可以在以后使用此值插入Data.Xml

entities.Data.Where(r => r.id == PK).First().Xml = "some XML data";
entities.SaveChanges();

这将从您刚刚插入的Data中抓取行(通过返回的id值),然后将值插入到Xml列中。

希望这能澄清一点。 如果您有不同的结构/存储过程,请发布一些代码示例,以便我们能够为您提供更具体的建议。