在Entity Framework 4中,我的数据库模型中有两个表(让我们称之为Info
和Data
)映射到实际的数据库表。在Info
表中,有一个DataId
列将两个表链接在一起(表总是1:1)。
表格中的重要栏目是:
信息:
数据:
我写了一个存储过程来插入数据。此过程首先在Data
中插入一行(因此我可以获取Data.id
值),然后在Info
中插入一行。当我调用context.SaveChanges()
时,它会在代码中调用。
我将此存储过程设置为在XmlDataInfo
上完成插入时运行,因为它包含除Data.Xml
以外的程序所需的所有字段。
由于Data.Xml
位于不同的表中,我遇到了两个问题......
如果我没有设置/更改Data.Xml
,INSERT
会正确运行我的存储过程。当我设置该值时,实体框架也会尝试在Data
表上执行插入操作。我只希望它运行插入两个表的存储过程调用(在Info
表上)。我需要设置Data.Xml
因为我的程序需要这个值所以我不能把它留空。
我无法弄清楚如何在存储过程映射中设置Data.Xml
值。它不允许我选择要在属性下拉列表中使用的属性的子元素。
我看到一些建议在代码中在Info
上创建一个部分类,我可以这样做以在代码中访问此属性,但该部分类属性在模型上不可用,所以我仍然无法选择它作为映射属性。
这就是我的问题。我还没有做过很多关于EF的事情,所以也许有些东西我缺少或做错了。
似乎应该有一些方法可以在Info上映射一个可以获取/设置Data.Xml
的字段然后调用我的过程而不尝试在Data
表上进行插入。我希望我可以在Info模型中添加某种代码属性,我可以获取此值,但我无法找到一种方法,可以在存储过程映射中访问它。
答案 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
列中插入一个值。
希望这会让事情变得清晰起来。如果您有不同的结构/存储过程,请为我们发布一些代码示例,以便为您提供更具体的建议。