在F#中,如何使用Type Provider访问Sql Server Geography数据类型?

时间:2014-01-15 15:04:12

标签: sql-server-2008 f# geography type-providers

是否可以使用F#中的Type Provider访问带有Geography类型列的SQL Server 2008表?

这是我的联系:

type dbSchemaAnalyticsWeb = SqlDataConnection<"Data Source=sql2008;Initial Catalog=Analytics;User ID=USER;Password=PASSWORD;">

然后插入数据的代码:

let dbAnalyticsSQL = dbSchemaAnalyticsWeb.GetDataContext()

let sqlGeogBuild = new SqlGeographyBuilder()
            sqlGeogBuild.BeginGeography(OpenGisGeographyType.Point);
            sqlGeogBuild.BeginFigure(lat, long)
            sqlGeogBuild.EndFigure()
            sqlGeogBuild.EndGeography()

            let LData = new dbSchemaAnalyticsWeb.ServiceTypes.LocationsData(
                                       Address = address,
                                       ZipCode = zipCode,                                          
                                       Longitude = long,
                                       Latitude = lat,
                                       GeoLocation = sqlGeogBuild.ConstructedGeography) 

在上面的代码中,字段GeoLocation从SQL Server引用了Geography数据类型。但是我得到一个错误“成员或对象构造函数'LocationData'没有参数或可设置的返回属性'GeoLocation'。是否有另一种方法来引用这个字段或其他一些接口,或者这种数据类型是不可访问的?

注意,我使用的是Visual Studio 2012和.Net 4.5。

1 个答案:

答案 0 :(得分:0)

您正在使用LinqToSql提供程序,该提供程序不支持SqlGeography类型。尝试使用Entity Framework提供程序。

以下是我在一个项目中引用使用SqlGeography的数据库的方法:

type internal Database = SqlEntityConnection<ConnectionStringName="DefaultConnection", LocalSchemaFile="Context.ssdl", ConfigFile="Web.config", ForceUpdate=true, Pluralize=true>

对于大多数用途,LinqToSql和Entity Framework提供程序非常相似。主要区别在于Entity Framework提供程序将类型公开为内部类,而LinqToSql公开事物。

如果由于某种原因你宁愿继续使用LinqToSql,那么有一些work-arounds可能会让你做你想做的事。