我有一个我创建的自定义类型,它应该作为guid持久存储在数据库(在本例中为SQL服务器)中(尽管这个问题对于可以存储为字符串的对象有效,整数等)。
当我将此类型作为参数传递给DbCommand对象时,我得到一个异常:
ArgumentException:从对象类型[...]到已知的托管提供者本机类型不存在映射。
我在类上有CType运算符,允许隐式转换为字符串或guid,但.NET不使用这些,因为它不知道它应该转换类型。
有没有办法在内部映射中添加类型,或者告诉.NET如何在数据库中存储我的自定义类型?
我显然可以在将它传递给.NET时自己转换类型,但我希望这会自动发生,就像大多数内置类型一样。
我尝试为我的类型实现一个TypeConverter类(继承自TypeConverter,重写CanConvertFrom,CanConvertTo,ConvertFrom,ConvertTo,IsValid,并将System.ComponentModel.TypeConverter属性添加到我的类中),但这仍然没有工作。
我假设它缺少一条告诉.NET在数据库中存储值时要转换为什么类型。
我现在的解决方法是,在将参数列表传递给SQL服务器之前拦截参数列表,并使用一种方法将我的自定义类型更改为guid。这很脏,但它现在确实有效,但我仍然认为这个问题没有答案。
答案 0 :(得分:3)
根据How should I pass a user-defined type to SqlParameterCollection.AddWithValue?,这是不可能的。我也查看了GetMetaTypeFromValue方法,看起来所有的映射实际上都是在框架中进行了硬编码,因此没有用户定义的映射是可能的。
有多烦人,拥有一个定义给定类型映射的属性真的很有用。
答案 1 :(得分:1)
解决创建界面的问题:
public interface ICustomDbValue
{
object Value { get; }
}
我为自定义类型实现了它。我还通过下一个代码工作的函数包装了SQL命令的创建:
...
IDbCommand command = connection.CreateCommand();
...
ICustomDbValue customParam = rawData as ICustomDbValue;
object value = customParam != null ? customParam.Value : rawData;
IDataParameter parameter = command.CreateParameter();
parameter.Value = value ?? DBNull.Value;
...
我必须要做的就是使用此函数并为我的类型实现ICustomDbValue。它几乎就像使用属性一样。
答案 2 :(得分:-1)