我有一个我创建的自定义类型,它应该作为 guid 保存在数据库(在本例中为 SQL 服务器)中(尽管这个问题对于可以存储为字符串、整数的对象同样有效, ETC)。
当我将此类型作为参数传递给 DbCommand 对象时,出现异常:
ArgumentException: No mapping exists from object type [...] to a known managed provider native type.
我在类上有 CType 运算符,允许隐式转换为字符串或 guid,但 .NET 不使用这些运算符,因为它不知道它应该转换类型。
有没有办法向内部映射添加类型,或者告诉 .NET 如何将我的自定义类型存储在数据库中?
我显然可以在将类型传递给 .NET 时自己转换类型,但我希望这会自动发生,就像对大多数内置类型所做的那样。
我已经尝试为我的类型实现一个 TypeConverter 类(继承自 TypeConverter,覆盖 CanConvertFrom、CanConvertTo、ConvertFrom、ConvertTo、IsValid,并将 System.ComponentModel.TypeConverter 属性添加到我的类),但这仍然没有不工作。
我假设它缺少一段告诉 .NET 在将值存储在数据库中时要转换为什么类型的部分。
目前,我的解决方法是在将参数列表传递给 SQL Server 之前拦截参数列表,并使用一种方法将我的自定义类型更改为 guid。这很脏,但它现在确实有效,但我仍然认为这个问题没有答案。
最佳答案
根据 How should I pass a user-defined type to SqlParameterCollection.AddWithValue? , 这是不可能的。我也查看了 GetMetaTypeFromValue 方法,看起来所有映射实际上都硬编码在框架中,因此不可能有用户定义的映射。
多么烦人,拥有一个定义给定类型映射的属性真的很有用。
关于.net - 为自定义类型创建 ADO.NET 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398325/