使用实体框架中的一个存储过程插入到两个表中
本文关键字:插入 两个 存储过程 一个 实体 框架 | 更新日期: 2023-09-27 18:31:26
在实体框架 4 中,我的数据库模型中有两个表(我们称它们为 Info
和 Data
)映射到实际的数据库表。在Info
表中,有一个DataId
列将两个表链接在一起(表始终为 1:1)。
表中的重要列包括:
信息:
- 编号
- DataId => 指向 Data.id 的链接
- 属性1
- 属性2
数据:
- id => 链接到 Info.DataId
- 目录
- 属性1
我编写了一个存储过程来插入数据。此过程首先在Data
中插入一行(以便我可以获取Data.id
值),然后在Info
中插入一行。当我调用 context.SaveChanges()
时,它会在代码中调用。
我将这个存储过程设置为在XmlDataInfo
上完成插入时运行,因为它包含除Data.Xml
之外的过程所需的所有字段。
由于Data.Xml
在不同的表中,我遇到了两个问题......
-
如果我不设置/更改
Data.Xml
,INSERT
将正确运行我的存储过程。当我设置该值时,实体框架也会尝试在Data
表上执行插入。我只希望它运行我的存储过程调用(在Info
表上),该调用插入到两个表中。我需要设置Data.Xml
因为我的过程需要这个值,所以我不能让它为 NULL。 -
我不知道如何在存储过程映射中设置
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
列中。
希望这能澄清一点。 如果您有不同的结构/存储过程,请发布一些代码示例,以便我们能够为您提供更具体的建议。