【问题标题】:Using one stored procedure in Entity Framework to insert into two tables使用实体框架中的一个存储过程插入两个表
【发布时间】:2016-01-21 21:26:55
【问题描述】:

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

表中的重要列是:

信息

  • 身份证
  • DataId => 指向 Data.id 的链接
  • 属性1
  • 属性2

数据

  • id => Info.DataId 的链接
  • XML
  • 属性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:1 关联。你应该放弃Info.DataIdData.Id 应参考Info.Id(制作Info 的原理)。 或者 Info.Id应该参考Data.Id(以Data为原则)。

标签: c# entity-framework


【解决方案1】:

很难准确地说出您在这里要做什么。我认为您可能对 EF 或应该如何调用存储过程没有完全了解。

需要注意的几点: 1.您的存储过程应该注意插入两个表。当从您的 C# 代码(通过 EF)调用它时,您不应该知道正在插入哪些表。 2. 如果您打算读/写数据,您的实体应该包括这两个表。如果您在实体中包含Data,EF 应自动创建一个属性以写入Data.Xml

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

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 列。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多