LazyLoad DropAndCreate Error

Feb 16, 2009 at 4:02 PM
 public abstract class t_user : LinqObjectModel<t_user>
    {
        [Length(40)]
        public abstract string mc { get; set; }
    }

    public abstract class t_test1 : LinqObjectModel<t_test1>
    {

        [BelongsTo, DbColumn("userId"), Index]
        [LazyLoad]
        public abstract t_user user { get; set; }
    }

    public abstract class t_test2 : LinqObjectModel<t_test1>
    {

        [BelongsTo, DbColumn("userId"), Index]
        [LazyLoad]
        public abstract t_user user { get; set; }
    }



de.DropAndCreate(typeof(t_user));
                de.DropAndCreate(typeof(t_test1));
Exception here~
                de.DropAndCreate(typeof(t_test2));
Coordinator
Feb 17, 2009 at 2:54 AM
All the relations are Lazy Load and they can't set by user.
Just remove the attribute LazyLoad will be fine.
Feb 17, 2009 at 8:26 AM
Edited Feb 17, 2009 at 8:30 AM
all the relations Id are not lazy load.

你写错了少了一个not.

不过这个异常很奇怪,有的类有的时候不抛出,有的类有的时候抛出。

public static DataType Parse(Type t)
{
if ( t.IsEnum )
{
t = typeof(Enum);
}
if ( Types.Contains(t) )
{
return (DataType)Types[t];
}
            if ( NullableHelper.IsNullableType(t) )
            {
                return NullableHelper.GetDataType(t);
            }
throw new ArgumentOutOfRangeException(t.ToString());
}


在这里抛出

不过我刚才又尝试了一遍,

即便你在belongsTo里面定义了lazyload,成功通过了DropAndCreate命令
在Find,select的时候还是要读这个字段的,这个lazyload在belongsto里面没啥用。

无视这个bug即可。

顺便,你有米有考虑过尝试着用c#4.0+VS2010的那个虚拟机的CTP尝试用C#4重构一下咧?或者等将来C#4发布之后...
Coordinator
Feb 17, 2009 at 9:07 AM
我没有少写not,所有的关联项都延迟加载的。你有兴趣的话,可以阅读 LazyLoadListBase 和 LazyLoadOneBase 的代码。
C# 4.0 的特性我了解过一下,主要两方面,并行运算库和动态特性。我考虑过使用动态特性,C#4甚至增加了dynamic关键字,不过思考的结果,动态特性对 DbEntry 没什么大的帮助,也许等C#4出来后,我用用再看,是否有什么有帮助的特性吧。
Feb 17, 2009 at 3:39 PM

不知道是你误解了我还是我误解了你,我怎么突然开始觉得咱俩说的是两码事。
-------------------------------------------------------------------------------------------

假设有如下两个表

    public abstract class t_user : LinqObjectModel<t_user>
    {
        [Length(40)]
        public abstract string mc { get; set; }
    }

    public abstract class t_test1 : LinqObjectModel<t_test1>
    {
        public abstract string ttt { get; set; }

        [BelongsTo, DbColumn("userId")]
        public abstract t_user user { get; set; }
    }


然后执行:

                DbContext de = DbEntry.Context;
                de.DropAndCreate(typeof(t_user));
                de.DropAndCreate(typeof(t_test1));

                var d = t_user.New();
                d.mc = "张三";
                d.Save();

                var f = t_test1.New();
                f.ttt = "asdsadas";
                f.user = d;
                f.Save();

                var a1 = t_test1.FindAll();
                var a2 = t_test1.FindOne(p => p.ttt == "asdsadas");
                var a3 = t_test1.FindById(1);

最后那三句话的SQL,可以看到是这样的:
Trace,,SQL,Select [Id],[ttt], [userId] From [t_test1];
<Text><60>(),
Trace,,SQL,Select [Id],[ttt], [userId] From [t_test1] Where [ttt] = @ttt_0;
<Text><60>(@ttt_0=asdsadas:String),
Trace,,SQL,Select [Id],[ttt], [userId] From [t_test1] Where [Id] = @Id_0;
<Text><60>(@Id_0=1:Int64),

因为如上所Trace的,您每一句SQL都生成了userId,所以
我理解为默认情况下userId这个字段not lazy load.

-----------------------------------------------------------------------------------------------------
其实我想实现这样的功能,就是说如果我给BelongsTo定义了这个Lazyload属性,如下:

public abstract class t_test1 : LinqObjectModel<t_test1>
    {
        public abstract string ttt { get; set; }

        [BelongsTo, DbColumn("userId")]
        [Lazyload]
        public abstract t_user user { get; set; }
    }

那么我再
执行如下三个语句

                var a1 = t_test1.FindAll();
                var a2 = t_test1.FindOne(p => p.ttt == "asdsadas");
                var a3 = t_test1.FindById(1);

就会生成这样的SQL代码,不含userId
Trace,,SQL,Select [Id],[ttt] From [t_test1];
<Text><60>(),
Trace,,SQL,Select [Id],[ttt] From [t_test1] Where [ttt] = @ttt_0;
<Text><60>(@ttt_0=asdsadas:String),
Trace,,SQL,Select [Id],[ttt] From [t_test1] Where [Id] = @Id_0;
<Text><60>(@Id_0=1:Int64),

然后当有需要的时候再
Select  userId From [t_test1] 什么的

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

不过我突然觉得这个功能也没啥用。