当使用ExecuteReader时,EF尝试映射SqlGeography而不是DbGeography

时间:2017-04-20 17:02:54

标签: c# entity-framework geography sqlgeography

为什么实体框架根据检索数据的方式将两种不同类型(SqlGeography和DbGeography)绑定到Geography类型的相同字段?

尝试通过ExecuteReader

读取数据时收到异常
  

来自物化' Microsoft.SqlServer.Types.SqlGeography'的指定演员表。输入' System.Data.Entity.Spatial.DbGeography'类型无效。

这是一张表:

CREATE TABLE [OneGeoField]([Position] [geography] NOT NULL

数据:

INSERT INTO OneGeoField (Position) VALUES(geography::STGeomFromText('POINT (30.5047009495918 59.862826902743)',4326))

EF为此表生成一个类,其DbGeography类型为Position字段:

public partial class OneGeoField
{
    public System.Data.Entity.Spatial.DbGeography Position { get; set; }
}

使用 SqlQuery 方法检索数据时,它可以正常工作

var query = "SELECT * FROM OneGeoField";    
var list = db.Database.SqlQuery<OneGeoField>(query).ToList();

但是如果使用 ExecuteReader ,则会抛出异常

        try
        {
            var cmd = db.Database.Connection.CreateCommand();
            db.Database.Connection.Open();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = query;
            var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            var objectContext = ((IObjectContextAdapter)db).ObjectContext;
            var list = objectContext.Translate<Core.OneGeoField>(reader).ToList();
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            db.Database.Connection.Close();
        }

只有解决方案是为ExecuteReader设置不同的模型,而另一种是常见的方法吗?

0 个答案:

没有答案