2016-01-21 74 views
2

在实体框架4中,我的数据库模型中有两个表(我们称它们为InfoData),它们映射到实际的数据库表。在Info表中,有一个将两个表链接在一起的DataId列(表格始终为1:1)。在桌子上在实体框架中使用一个存储过程来插入两个表

重要的列有:

信息

  • 编号
  • 数据ID =>链接到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,因为我的过程需要这个值,所以我不能让它为NULL。

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

我看到了一些建议,在代码上Info创建一个部分类,我能做到这一点的代码来访问此属性但部分类属性是不可用的模型,所以我还是不能选择它作为映射属性。


这就是我的问题。我还没有做过很多EF的工作,所以也许有一些我错过了或者做错了。

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

+0

EF中正确的1:1关联。你应该放弃'Info.DataId'。 'Data.Id'应该指'Info.Id'(使Info'成为原理)。 *或*'Info.Id'应该引用'Data.Id'(使'Data'成为原则)。 –

回答

0

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

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

创建用于写入的特性现在,让我们假设你所有的表列是VARCHAR处理(串)除了你的Id它们的PK(整数)。您的存储过程的原型看起来像:

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

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