动态类型转换实体框架ORM

时间:2018-02-06 08:27:11

标签: c# sql entity-framework orm telerik

您好我正在使用 Telerik ORM 的旧代码。 基于 MSsql 数据库,该数据库是从后端的 db2 迁移而来的。

据我所知 DB2 没有提供用于在表中存储布尔值的专用类型。这个问题有不同的解决方法。在我的情况下决定使用自定义Sql类型 BITTYPE:char(1),实际上保留了两个不同的 char(1)值('1' (true)和{{ 1}})。 Telerik ORM 使用自定义'0' (false)将此char(1)值转换为域布尔属性

AdoTypeConverter

问:我无法更改数据库,但我需要以某种方式教授实体框架ORM 适用于同一场景

P.s 在我阅读完文章后(

我尝试使用约定解决了这个问题,但它没有带来结果。

  1. BITTYPE:char(1) - 错误:在SqlServer提供程序清单中找不到
  2. 字符 - **错误:**指定的架构无效。错误:     (8,12):错误2019:指定的成员映射无效。 ..
  3. 代码段:

    public class BitTypeToBooleanConverter : TypeConverterBase
    {
        public BitTypeToBooleanConverter()
        {
            this.ConverterType = typeof(bool);
            this.NullableConverterType = typeof(bool?);
        }
    
        public override object Read(ref DataHolder holder)
        {
            bool n = holder.Reader.IsDBNull(holder.Position);
            holder.NoValue = n;
            if (n)
            {
                if (nullable)
                    holder.ObjectValue = null;
                else if (holder.Box)
                    holder.ObjectValue = false;
                else
                    holder.BooleanValue = false;
            }
            else
            {
                string s = holder.Reader.GetValue(holder.Position).ToString();
                bool outValue = false;
                if (!bool.TryParse(s,out outValue))
                {
                    if (s.Equals("1"))
                    {
                        outValue = true;
                    }
                }
                if (nullable || holder.Box)
                    holder.ObjectValue = outValue;
                else
                    holder.BooleanValue = outValue;
            }
            return (holder.Box || nullable) ? holder.ObjectValue : null;
        }
    
        public override void Write(ref DataHolder holder)
        {
            holder.Parameter.DbType = System.Data.DbType.String;
            if (holder.NoValue)
            {
                holder.Parameter.Size = 1;
                holder.Parameter.Value = null;
            }
            else
            {
                string s = (holder.BooleanValue ? "1" : "0");
                holder.Parameter.Size = s.Length;
                holder.Parameter.Value = s;
            }
        }
    
        public override bool CreateLiteralSql(ref DataHolder holder)
        {
            if (holder.NoValue)
            {
                holder.StringValue = "NULL";
                return false;
            }
            else
            {
                holder.StringValue = (holder.BooleanValue ? "1" : "0");
                return true; // inidicating that ' are needed around, because it is a character column (VARCHAR)
            }
        }
    

    我也知道我可以尝试创建另一个将转换字符串值的属性,但我想要更多"可重复使用" 变体

1 个答案:

答案 0 :(得分:0)

结论:在进行搜索后,我实际上还没有找到适当的解决方案来解决前额问题。因此决定继续使用数据访问级别的默认实体框架行为(不进行任何转换),并通过映射(automapper)(即实体到域模型)在下一个应用程序级别执行此操作

相关问题