C# 实体框架:映射函数参数的困难

C# 实体框架:映射函数参数的困难,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我试图在我的模型中创建一个实体,它有两个属性来指定它的纬度和经度。在SQLServer2008R2中,我使用表中的一列来存储此信息。该列为地理类型。为了对数据库使用实体,我希望映射3个存储过程,以插入、更新和删除数据库中相应表中的行。但是,我很难让包含我的模型的程序集在没有任何错误的情况下进行编译。我对使用EF4还是相当陌生的,所以我不太确定如何正确地做到这一点。我的部分类看起来像: public partial class MyEntity { private double latit

我试图在我的模型中创建一个实体,它有两个属性来指定它的纬度和经度。在SQLServer2008R2中,我使用表中的一列来存储此信息。该列为地理类型。为了对数据库使用实体,我希望映射3个存储过程,以插入、更新和删除数据库中相应表中的行。但是,我很难让包含我的模型的程序集在没有任何错误的情况下进行编译。我对使用EF4还是相当陌生的,所以我不太确定如何正确地做到这一点。我的部分类看起来像:

public partial class MyEntity
{
    private double latitude;
    private double longitude;

    public double Latitude { get {return latitude;} set {latitude = value; }
    public double Longitude { get {return longitude;} set {longitude = value; }
}
我的存储过程采用纬度和经度参数,删除存储过程除外。然而,当我试图编译项目时,我得到了错误:

映射函数绑定指定一个函数 MyNamespace.Store.sp_insertMyEntity,但未映射以下内容 功能参数:纬度、经度


不知为什么,我一定是错误地声明了属性。也许在我的模型里。欢迎提出任何建议

假设您已使用ADO.NET实体数据模型在EF和数据库之间映射,映射到SP的最简单方法是使用模型浏览器中的向导

打开模型浏览器 选择存储节点 转到存储过程并选择要映射的存储过程 右键单击该项并选择函数导入。向导对话框将出现。 单击按钮获取列信息 单击“创建复杂类型”按钮,这将基于列信息创建类型 在“无线电控制”中,选择“复杂”并关联创建的新复杂类型 单击“确定”
这将创建一个可以使用的新函数。它将处理与SP的通信,包括参数,而您可以像使用普通函数一样使用它。

据我所知,您当前的实体没有映射纬度和经度。这意味着您永远无法从数据库中加载它们,也无法将它们保存到数据库中—不可能

存储过程不能期望EF不支持的任何参数。如果您的数据库表使用地理数据类型,则还必须提供视图,该视图将其拆分为单独的纬度和经度列。实体必须具有经度和纬度作为属性,并且必须映射到视图。您的过程必须接受映射的纬度和经度作为参数


EF的下一个主要版本应该直接支持地理。

您是先编写EF代码还是在EF之前已经有了数据库和SP?@Ronald:我先创建了表,然后右键单击设计器使用数据库中的更新模型。谢谢,很高兴知道这一点。我想我可以使用导入函数来解决我的问题。目前,我有1个打开我的edmx文件的designer视图,2个单击MyEntity,3个打开Mapping Details窗口,4个为每个CRUD操作分配了一个单独的存储过程,减去检索,使其成为3个存储过程。问题似乎是因为我的insert存储过程的纬度和经度参数没有与MyEntity正确对齐,但我不确定是否可以修复。@Andrew:这是正确的方法,但您的意思是您的参数没有与实体正确对齐?简而言之,实体属性必须正确映射到存储过程参数。@Ladislav Mrnka:好吧,更准确一点,这是一种正确的方法,但不一定是正确的方法。我不想创建导入函数。我试图重新定义EF为与数据库交互而动态创建的默认存储过程。据我所知,其中有3个用于插入,一个用于更新,一个用于删除。在Lerman编写的实体框架编程中,她讨论了重写它们,这是我在前面的评论中尝试使用的过程。问题是其中一个t-sql数据类型在EF中没有类似项。可能问题是我需要在模型本身中包含这些属性纬度和经度,然后进入3层xml并手工编写映射代码。今天晚上,当我从另一份工作回来后,我会尝试一下。而且,这个问题很容易重现。只要在SQLServer2008中创建任何带有地理列的表即可。然后尝试将一个实体映射到它。这就是我想做的。谢谢你,拉迪斯拉夫。实际上,我只是在表中添加了纬度和经度列,然后添加了一个触发器来更新未映射的地理列。运作良好;