使mono的SqlMetal理解PostgreSQL中的用户/扩展定义类型

时间:2013-08-13 16:04:54

标签: .net postgresql mono sqlmetal

我正在尝试将我的rails webapp移植到C#(mono),我想使用相同的数据库。当我尝试使用sqlmetal创建Linq架构时,我收到以下错误消息:

sqlmetal: System.ArgumentException: Don't know how to convert the SQL type 'name' into a managed type.
Parameter name: dataType
  at DbLinq.Vendor.Implementation.SchemaLoader.MapDbType (System.String columnName, IDataType dataType) [0x00000] in <filename unknown>:0 
  at DbLinq.Vendor.Implementation.SchemaLoader.LoadColumns (DbLinq.Schema.Dbml.Database schema, DbLinq.Schema.SchemaName schemaName, IDbConnection conn, INameAliases nameAliases, DbLinq.Schema.NameFormat nameFormat, DbLinq.Vendor.Implementation.Names names) [0x00000] in <filename unknown>:0 
  at DbLinq.Vendor.Implementation.SchemaLoader.Load (System.String databaseName, INameAliases nameAliases, DbLinq.Schema.NameFormat nameFormat, Boolean loadStoredProcedures, System.String contextNamespace, System.String entityNamespace) [0x00000] in <filename unknown>:0 
  at DbMetal.Generator.Implementation.Processor.ReadSchema (DbMetal.Parameters parameters, ISchemaLoader& schemaLoader) [0x00000] in <filename unknown>:0 
  at DbMetal.Generator.Implementation.Processor.ProcessSchema (DbMetal.Parameters parameters) [0x00000] in <filename unknown>:0 

我的数据库使用两个扩展程序:hstorePostGIS。当我删除这两个扩展时,sqlmetal设法正确创建模式。这两个扩展都会导致错误 - 当我只删除一个(尝试过两个)时,我仍然会得到它。当然,删除这些扩展并不是一种选择......

据我所知,问题是sqlmetal不理解这些扩展中定义的自定义类型。我在网上搜索并发现我需要使用自定义模式加载器来定义如何处理这些类型,而sqlmetal的嵌入式文档说我应该用--with-schema-loader来做 - 但我仍然无法找到这样做:

  • --with-schema-loader定义用作自定义加载器的类,但是在哪里可以指定包含该类的DLL文件?
  • 我该怎么写这个架构加载器?我找不到一个例子,但嵌入式文档说它需要实现ISchemaLoader。我找不到它的文档,it's source code没有告诉我任何事情(我期待像MyBatis的'YypeHandlers ......)

任何人都可以告诉我如何做到这一点吗?

1 个答案:

答案 0 :(得分:0)

我的最终解决方案是根本不使用Linq to SQL,而是使用微型ORM(PetaPoco)