使用Entity Framework中的一个存储过程插入两个表

时间:2016-01-21 21:26:56

标签: c# entity-framework

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

表格中的重要栏目是:

信息

  • 编号
  • DataId =>指向Data.id的链接
  • Property1
  • Property2

数据

  • id =>指向Info.DataId的链接
  • XML
  • Property1

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

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

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

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

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

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

    这就是我的问题。我还没有做过很多关于EF的事情,所以也许有些东西我缺少或做错了。

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

1 个答案:

答案 0 :(得分:0)

很难准确说出你在这里想要做什么。我想你可能没有完全理解EF或者应该如何调用存储过程。

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

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

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

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

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

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

希望这会让事情变得清晰起来。如果您有不同的结构/存储过程,请为我们发布一些代码示例,以便为您提供更具体的建议。