在0.33版本中怎么关联查询

May 30, 2010 at 8:59 AM

你好,

我想问一下在0.33版本中怎么关联查询,我试了这个例子:

 public abstract class TestClass1 : DbObjectModel<TestClass1>
    {
        public abstract string Name { get; set; }
    }

    public class TestClass2 : DbObject
    {
        public TestClass2() { }
        public int Age;
    }

    [JoinOn(0, "TestClass1.Id", "TestClass2.Id", CompareOpration.Equal, JoinMode.Inner)]
     public class JoinClass : IDbObject
    {
        [DbColumn("TestClass1.Id")]
        public long Id;

        public string Name;

        public int Age;
    }

 

总是会报出“未设置对象实例的错误”,

后来我发现在3.5的版本中有CreateTableList这个标记语言  可是0.33版本中没找到,例子中也没有

希望您能解答一下,谢谢

Coordinator
May 30, 2010 at 9:22 AM

参见Samples中的Orm06

May 30, 2010 at 10:13 AM
Edited May 30, 2010 at 10:16 AM

谢谢,我不知道这个是不是Bug,我跟了一下源码,以下是DbContext类中的代码,红色的是我加了一个判断

private void TryCreateTable(Type DbObjectType)
        {
            if (DataSetting.AutoCreateTable)
            {
                if (TableNames == null)
                {
                    InitTableNames();
                }
                ObjectInfo oi = ObjectInfo.GetInstance(DbObjectType);
                string Name = oi.From.GetMainTableName();
                //yyp JoinOn报错  对name为null表不进行创建
                if (!string.IsNullOrEmpty(Name))
                {
                    if (!TableNames.ContainsKey(Name.ToLower()))
                    {
                        IfUsingTransaction(Dialect.NeedCommitCreateFirst, delegate()
                        {
                            Create(DbObjectType);
                            if (!string.IsNullOrEmpty(oi.DeleteToTableName))
                            {
                                Create_DeleteToTable(DbObjectType);
                            }
                            foreach (ManyToManyMediTable mt in oi.ManyToManys.Values)
                            {
                                if (!TableNames.ContainsKey(mt.Name.ToLower()))
                                {
                                    if (DbObjectType.Assembly.FullName.StartsWith(MemoryAssembly.DefaultAssemblyName))
                                    {
                                        Create_ManyToManyMediTable(DbObjectType.BaseType, mt.HandleType);
                                    }
                                    else
                                    {
                                        Create_ManyToManyMediTable(DbObjectType, mt.HandleType);
                                    }
                                }
                            }
                        });
                    }
                }
            }
        }

导致错误的原因可能是:

由于我在配置中设置了自动创建表 所以在遇到关联表时依然会去创建,因此在执行 string Name = oi.From.GetMainTableName();后Name为空,最后造成异常,所以我在这里加了一个判断,一切都正常了

如果有错误希望您能再指点我一下



 

Coordinator
May 30, 2010 at 11:19 AM
Edited Jun 5, 2010 at 5:03 AM

0.33版的细节我记不太清了。

不过,早期DbEntry版本,对于JoinOn的类,需要自己先好创建好相关表,在自动创建表模式下是否有问题,记不清了。

目前版本使用Type关联原始类,所以可以自动创建相关表,也就不存在此问题了。

如果两个类Map到一个表,使用DbTable(Type)定义,则也可以自动创建相关表。

不过,自动创建表模式只应用于开发,而不应该用于部署。

May 30, 2010 at 2:22 PM

受教了,谢谢!