为自定义类型创建ADO.NET映射

时间:2008-12-29 18:52:54

标签: .net database

我有一个我创建的自定义类型,它应该作为guid持久存储在数据库(在本例中为SQL服务器)中(尽管这个问题对于可以存储为字符串的对象有效,整数等)。

当我将此类型作为参数传递给DbCommand对象时,我得到一个异常:

  

ArgumentException:从对象类型[...]到已知的托管提供者本机类型不存在映射。

我在类上有CType运算符,允许隐式转换为字符串或guid,但.NET不使用这些,因为它不知道它应该转换类型。

有没有办法在内部映射中添加类型,或者告诉.NET如何在数据库中存储我的自定义类型?

我显然可以在将它传递给.NET时自己转换类型,但我希望这会自动发生,就像大多数内置类型一样。


我尝试为我的类型实现一个TypeConverter类(继承自TypeConverter,重写CanConvertFrom,CanConvertTo,ConvertFrom,ConvertTo,IsValid,并将System.ComponentModel.TypeConverter属性添加到我的类中),但这仍然没有工作。

我假设它缺少一条告诉.NET在数据库中存储值时要转换为什么类型。


我现在的解决方法是,在将参数列表传递给SQL服务器之前拦截参数列表,并使用一种方法将我的自定义类型更改为guid。这很脏,但它现在确实有效,但我仍然认为这个问题没有答案。

3 个答案:

答案 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)