在 Entity Framework 4 中,我的数据库模型中有两个表(我们称它们为 Info
和 Data
),它们映射到实际的数据库表。在 Info
表中,有一个 DataId
列将两个表链接在一起(表始终为 1:1)。
表格中的重要列是:
信息:
- 身份证
- DataId => 链接到 Data.id
- 属性(property)1
- 属性(property)2
数据:
- id => 指向 Info.DataId 的链接
- XML
- 属性(property)1
我写了一个存储过程来插入数据。此过程首先在 Data
中插入一行(因此我可以获得 Data.id
值),然后在 Info
中插入一行。当我调用 context.SaveChanges()
时,它在代码中被调用。
我将此存储过程设置为在 XmlDataInfo
上完成插入时运行,因为它包含该过程所需的所有字段,Data.Xml
除外。
由于 Data.Xml
在不同的表中,我遇到了两个问题...
如果我没有设置/更改
Data.Xml
,INSERT
会正确运行我的存储过程。当我设置该值时, Entity Framework 也会尝试在Data
表上插入。我只希望它运行我的存储过程调用(在Info
表上),该调用将插入到两个表中。我需要设置Data.Xml
,因为我的过程需要这个值,所以我不能将其保留为 NULL。我不知道如何在存储过程映射中设置
Data.Xml
值。它不允许我选择要在属性下拉列表中使用的属性的子元素。
我看到一些关于在代码中的 Info
上创建分部类的建议,我可以这样做以在代码中访问此属性,但该分部类属性在模型上不可用,所以我仍然可以'不要选择它作为映射属性。
这就是我的问题。我还没有用 EF 做很多事情,所以也许我遗漏了一些东西或做错了。
似乎应该有一些方法可以在 Info 上映射一个可以获取/设置 Data.Xml
的字段,然后调用我的过程而不用尝试在 上插入数据
表。我希望我可以向 Info 模型添加某种仅代码属性,我可以使用它来获取此值,但我想不出一种方法来做到这一点,因为它可以在存储过程映射中访问。
最佳答案
很难准确地说出您要在这里做什么。我认为您可能对 EF 或应该如何调用存储过程没有完整的了解。
需要注意的几点:
1. 你的存储过程应该负责插入到两个表中。从您的 C# 代码(通过 EF)调用它时,您不应该能够分辨出哪些表被插入了。
2. 如果您打算读/写数据,您的实体应该包括这两个表。如果您在实体中包含 Data
,EF 应自动创建一个属性以写入 Data.Xml
现在,假设您的所有表列都是 varchars(字符串),除了您的 Id 是 PK(整数)。您的存储过程原型(prototype)如下所示:
int MyStoredProcedure(string dataProperty1, string infoProperty1, string infoProperty2)
当您从 C# 调用此函数然后调用 SaveChanges()
时,存储过程会将字符串插入到您的表中并返回给您 PK (int
)插入到 Data
表中的记录。您现在可以使用此值稍后插入您的 Data.Xml
。
entities.Data.Where(r => r.id == PK).First().Xml = "some XML data";
entities.SaveChanges();
这将从您刚刚插入的 Data
中获取行(通过返回的 id
值),然后将一个值插入到 Xml
中专栏。
希望这能让事情变得更清楚一些。如果您有不同的结构/存储过程,请发布一些代码示例,以便我们能够为您提供更具体的建议。
关于c# - 在 Entity Framework 中使用一个存储过程插入到两个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34934672/