Report a Bug(MYSQL)

Dec 29, 2009 at 3:27 PM

1) First


    public abstract class T1 : DbObjectModel<T1>
    {
        public abstract double Price { get; set; }
    }


    public abstract class T2 : DbObjectModel<T2>
    {
        public abstract long T1Id { get; set; }
    }

    public class TM : IDbObject
    {
        public double Price { get; set; }
    }

 

2) Second

 DbEntry.Context.DropAndCreate(typeof(T1));
            DbEntry.Context.DropAndCreate(typeof(T2));

            var t1 = T1.New;
            t1.Price = 0;
            t1.Save();

            var t2 = T2.New;
            t2.T1Id = 1;
            t2.Save();

            var m1 = T1.FindAll();
            var m2 = DbEntry.Context.ExecuteList<TM>("SELECT T1.Price FROM T1 INNER JOIN  T2 on T1.Id = T2.T1Id");

最后一行报错

 

public class TM : IDbObject
    {
        public double Price { get; set; }  这个Double Dbentry不知为啥认为是Float
    }

 

就是说没有JOIN的语句的Double可以映射

有Join语句的Double不能映射

-------------

SQLite没错。就MYSQL有错。

------------

为了更加方便的JOIN,我现在回到拼接SQL语句状态了。还是拼接强大。~

Dec 29, 2009 at 3:29 PM

<add key="NameMapper" value="Lephone.Util.Text.InflectionNameMapper, Lephone.Util" />

这个InflectionNameMapper真是诡异啊。为啥这么复杂的规则?有啥实际需求需要这样呢。。。。

Coordinator
Dec 29, 2009 at 4:11 PM
Edited Dec 29, 2009 at 4:16 PM

从英语语义来说,Model因为表示一条记录,所以应该是单数,而数据库表因为包含多条记录,所以应该是复数。比如Model是Person,表名是People。。。

而单数变复数规则是比较复杂的,有些直接加s,有些加es,有些去y加ies,有些完全无规则。。。

MySql的问题我回头查一下,不过,DbEntry执行Sql返回List的时候,是使用名称映射的,我觉得至少要 select T1.price as Prince ... 才行。。。

Dec 30, 2009 at 9:17 AM

后来我把Double全改成Float,也出错。我就郁闷了。不能等老大了,自己动手。尝试解决如下:

 

public class MySql : DbDialect
 {
  public MySql()
  {
            TypeNames[DataType.Guid] = "CHAR(36)";
            TypeNames[DataType.Binary] = "BLOB";
            TypeNames[DataType.Double] = "DOUBLE";
            TypeNames[DataType.Single] = "FLOAT";

 

尝试解决

Coordinator
Dec 30, 2009 at 9:31 AM

结果怎样呢?

Coordinator
Dec 30, 2009 at 10:50 AM

试了一下,感觉应该是MySql或者MySql .net provider的错误吧。

DbEntry.Context.ExecuteDataReader(new SqlStatement("SELECT Price FROM T1 WHERE Id = 1;"),
    dr =>
    {
        dr.Read();
        var p = dr["Price"];
        Console.WriteLine(p.GetType());
        Console.WriteLine(p);
    });
DbEntry.Context.ExecuteDataReader(new SqlStatement("SELECT T1.Price as Price FROM T1 INNER JOIN  T2 on T1.Id = T2.T1Id;"),
    dr =>
    {
        dr.Read();
        var p = dr["Price"];
        Console.WriteLine(p.GetType());
        Console.WriteLine(p);
    });
输出结果是:

System.Single
0
System.Single
0

不管有没有加你添加的映射,以及网上看到的的把double映射成REAL的方式,都是这个结果。

T1.FindAll() 使用的是按Index取值的 dr.GetDouble(index) 函数,而使用 SQL 是使用的是 (double) dr["Price"] ,显然 GetDouble 做了数据转换,而直接转换似乎不行。

直接用 SQL 的话,有时候就不用写 Model 了,使用 ExecuteDataset 就行了。