Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中使用一个存储过程插入到两个表中_C#_Entity Framework - Fatal编程技术网

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

C# 在实体框架中使用一个存储过程插入到两个表中,c#,entity-framework,C#,Entity Framework,在EntityFramework4中,我的数据库模型中有两个表,我们称它们为信息和映射到实际数据库表的数据。在Info表中,有一个DataId列将两个表链接在一起。表始终为1:1 表中的重要列包括: 信息: 身份证件 DataId=>指向Data.id的链接 物业1 物业2 数据: id=>指向Info.DataId的链接 Xml 物业1 我编写了一个存储过程来插入数据。此过程首先在数据中插入一行,以便获得Data.id值,然后在Info中插入一行。当我调用context.SaveChanges

在EntityFramework4中,我的数据库模型中有两个表,我们称它们为信息和映射到实际数据库表的数据。在Info表中,有一个DataId列将两个表链接在一起。表始终为1:1

表中的重要列包括:

信息:

身份证件 DataId=>指向Data.id的链接 物业1 物业2 数据:

id=>指向Info.DataId的链接 Xml 物业1 我编写了一个存储过程来插入数据。此过程首先在数据中插入一行,以便获得Data.id值,然后在Info中插入一行。当我调用context.SaveChanges时,它会在代码中被调用

我将此存储过程设置为在XmlDataInfo上执行插入操作时运行,因为它包含除Data.Xml之外的过程所需的所有字段

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

如果我没有设置/更改Data.Xml,INSERT将正确运行存储过程。当我设置该值时,实体框架也会尝试在数据表上进行插入。我只希望它对插入两个表的Info表运行我的存储过程调用。我需要设置Data.Xml,因为我的过程需要这个值,所以不能将其保留为NULL

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

我看到一些关于在代码中的信息上创建分部类的建议,我可以在代码中访问此属性,但分部类属性在模型上不可用,因此我仍然无法选择它作为映射属性

这就是我的问题所在。我还没有在EF上做很多工作,所以可能我遗漏了一些东西或者做得不正确


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

很难确切地说出您在这里要执行的操作。我认为您可能对EF或如何调用存储过程没有完全的了解

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

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

int MyStoredProcedure(string dataProperty1, string infoProperty1, string infoProperty2)
当您从C调用此函数,然后保存更改时,存储过程会将字符串插入到表中,并将插入到数据表中的记录的PK int返回给您。现在,您可以稍后使用此值插入Data.Xml

entities.Data.Where(r => r.id == PK).First().Xml = "some XML data";
entities.SaveChanges();
这将从您刚刚通过返回的id值插入的数据中获取行,然后将值插入Xml列


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

了解EF中正确的1:1关联。您应该删除Info.DataId。Data.Id应参考Info.Id,以Info为原则。或信息。Id应参考数据。Id以数据为原则。