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

Posted

技术标签:

【中文标题】在 F# 中,如何使用 Type Provider 访问 Sql Server Geography 数据类型?【英文标题】:In F#, how can I access Sql Server Geography data type with Type Provider? 【发布时间】:2014-01-15 15:04:11 【问题描述】:

是否可以使用 F# 中的类型提供程序访问具有地理类型列的 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】:

您正在使用 LinqToSql 提供程序,它不支持 SqlGeography 类型。尝试使用实体框架提供程序。

这是我在我的一个项目中引用使用 SqlGeography 的数据库的方式:

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

在大多数情况下,LinqToSql 和实体框架提供程序非常相似。主要区别在于实体框架提供者将类型公开为内部类型,而 LinqToSql 将其公开。

如果出于某种原因您更愿意继续使用 LinqToSql,则有一些 work-arounds 可能允许您做您想做的事情。

【讨论】:

谢谢。我通过添加插入/更新触发器找到了另一种解决方法。请参阅 rheitzman 的回答,link 这个包不支持dotnetcore

以上是关于在 F# 中,如何使用 Type Provider 访问 Sql Server Geography 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部应用访问另一个应用中的contentprovider

如何在 Flutter 中使用 Provider 正确获取 API

Angular 2 错误:无效的提供者 - 只允许提供 Provider 和 Type 的实例,得到:[object Object]

如何在 Python 中使用 Gtk.StyleContext.remove_provider()?

如何在 Flutter 中使用 Provider 显示来自 ChangeNotifier 的错误

如何在 Service 类中使用 Fused Location Provider?