能否对ORM_Tutorial示例中的User和Group的多对多关系做一个Save的演示

3 views
Skip to first unread message

fen...@gmail.com

unread,
Nov 16, 2006, 8:58:01 AM11/16/06
to NBear Google Group
即如何将一个User和一个Group关联?保存顺序是否有要求?

Teddy

unread,
Nov 16, 2006, 9:22:51 AM11/16/06
to nbear...@googlegroups.com
ORM_Tutorial教程中有非级联更新的User Group关联保存演示。
 
当Groups属性包含Contained=true修饰时,则,save user时,Groups能自动级联保存。
 
Teddy
 
On 11/16/06, fen...@gmail.com <fen...@gmail.com> wrote:
即如何将一个User和一个Group关联?保存顺序是否有要求?

MK2

unread,
Nov 16, 2006, 9:23:26 AM11/16/06
to NBear Google Group
我尝试了这种方法:
UserRole ur = new UserRole();
        ur.UserID = user.ID;
        ur.RoleID = role.ID;
        gateway.Save<UserRole>(ur);

 
On 11/16/06, fen...@gmail.com <fen...@gmail.com> wrote:
即如何将一个User和一个Group关联?保存顺序是否有要求?


--
能Web就Web.

Teddy

unread,
Nov 16, 2006, 9:33:54 AM11/16/06
to nbear...@googlegroups.com
如果用这种方法的话,需要保证user和role在userrole保存之前先保存。

MK2

unread,
Nov 16, 2006, 9:41:18 AM11/16/06
to nbear...@googlegroups.com
原来早就有例子了,呵呵,我一开始只看Adv的示例,呵呵,打搅了。
我觉得还是用这种不关联的方式比较好,如果关联了,删除了其中一个,那么它关联的也会被删除吧?

 
--
能Web就Web.

Teddy

unread,
Nov 16, 2006, 9:44:31 AM11/16/06
to nbear...@googlegroups.com
是的。可以根据需要来,有时级联更新也需要,但大多数时候,多对多关联不需要这样的级联更新/删除。

MK2

unread,
Nov 16, 2006, 10:23:20 AM11/16/06
to nbear...@googlegroups.com
在ORM_Adv中,若直接使用User,而不用LocalUser,执行下面这段代码,会出错。
Entities.User oUser = new User();
        oUser.Birthday = DateTime.Now;
        gateway.Save<Entities.User>(oUser);
        oUser.Birthday = DateTime.Now;
        gateway.Save<Entities.User>(oUser);
 
错误代码如下:集合已修改;可能无法执行枚举操作。
换成LocalUser,则不会出错。

MK2

unread,
Nov 16, 2006, 11:13:15 AM11/16/06
to nbear...@googlegroups.com
对于这种一对多自关联,Save的顺序又是怎样的?在ORM_Adv示例中只是使用了PerantID外键。。。。
 
public interface Group : Entity

    {

        [PrimaryKey]

        Guid ID { get; set; }

        string Name { get; set; }

 

        [FkReverseQuery(LazyLoad=true)]

        [MappingName("ParentID")]

        Group ParentGroup { get; set; }

 

        [FkQuery("ParentGroup", LazyLoad=true)]

        [SerializationIgnore]

        Group[] ChildGroups { get; set; }

    }
 
每次创建一个Group,PatentID该如何付值呢?

Teddy

unread,
Nov 16, 2006, 6:49:17 PM11/16/06
to nbear...@googlegroups.com
前一个问题已经确认是bug,我会修复。第二个问题,其实也算v3.2.5的一个bug,原来,我会为标注FkReverseQuery的属性自动生成外键约束,但事实证明是不行的,像这种情况就不能设置外键约束,否则,root元素的ParentID就不知放什么值了。所以我已经改成,不自动对FkReverseQuery属性生成外键约束了,如果需要外键约束的,需要同时标注FriendKeyAttribute。
 
谢谢你的测试,你真的很细心,绝对有测试的天赋~~
 
Teddy
 

MK2

unread,
Nov 16, 2006, 9:47:04 PM11/16/06
to nbear...@googlegroups.com
):  要不是有NBear,可能已经对底层数据库彻底地放弃了`````呵呵,为了尽快地熟悉NBear,还看了许多之前不想看的SQL语法,再看回NBear生成的SQL脚本,领会了许多表与表的关联方式。因为自己之前做的开发,一点表与表的关联都没有,甚至连视图都少用,呵呵,所以真的是感谢NBear,不仅让ORM的实现如此简单,还使我上了一堂宝贵的课。
--
能Web就Web.

MK2

unread,
Nov 18, 2006, 4:36:56 AM11/18/06
to nbear...@googlegroups.com
一对多自关联中的问题:
Category的Parent设置了FkReverseQuery ,生存的SQL脚本 "[ParentID] int NULL" 是Int型,但是如果不对Parent赋值,运行时逻辑如下:
 
Text INSERT INTO [Category] ( [Name], [Description], [ParentID], [Sort], [User_ID], [Group_ID], [Visible] ) VALUES ( @Name, @Description, @ParentID, @Sort, @User_ID, @Group_ID, @Visible ); SELECT SCOPE_IDENTITY() 
Parameters:
@Name[String] = CategoryName
@Description[String] = Category
@ParentID[String] =
@Sort[Int32] = 0
@User_ID[Int32] = 2
@Group_ID[Int32] = 2
@Visible[Boolean] = True
这显示是错误了,但是如果对Parent赋值了,则正常,如:@ParentID[int32] = 1。
 
呵呵,测试来晚``````
 
 
 
 

Teddy

unread,
Nov 18, 2006, 4:42:48 AM11/18/06
to nbear...@googlegroups.com
恩,确实是个问题,我会修正它~~

MK2

unread,
Nov 18, 2006, 9:11:05 AM11/18/06
to nbear...@googlegroups.com
是否问题还存在````始终还是@ParentID[String] =
正确应该是@ParentID[int] = 0 
 
我已经更新到3.3.3了。
 

Teddy

unread,
Nov 18, 2006, 9:38:19 AM11/18/06
to nbear...@googlegroups.com
保存有没有出错呢?正确的应该@ParentID[int]=
等于后面没东西,因为ParentID默认是int?类型的。
 
你能把实体设计的代码发出来吗?
 
我会再测试一下。

 
On 11/18/06, MK2 <fen...@gmail.com> wrote:

MK2

unread,
Nov 18, 2006, 9:48:44 AM11/18/06
to nbear...@googlegroups.com
1对多的自关联:

        [FkReverseQuery(LazyLoad = true)]
        [MappingName("ParentID")]
        [SerializationIgnore]
        Category Parent
        {
            get;
            set;
        }

        [FkQuery("Parent", OrderBy = "{Name} DESC", LazyLoad = true)]
        Category[] Childs
        {
            get;
            set;
        }

Category cat = new Category();

        WriteLine("Save ParentCategory:");
        gateway.Save<Category>(cat);


        Category childCat = new Category();
        childCat.Parent = cat;
        gateway.Save<Category>(childCat);

gateway.Save<Category>(cat)的运行时中就出现了我之前所说的情况,而gateway.Save<Category>(childCat)则正常。也就是说,没有指定Parent时,默认会被设置成@ParentID[String]=   ,而不是@Parent[int]=0

MK2

unread,
Nov 18, 2006, 9:49:56 AM11/18/06
to nbear...@googlegroups.com
生成的数据库中,ParengID列是整型的,保存空字符到该列,没有出现错误。
--
能Web就Web.

Teddy

unread,
Nov 18, 2006, 8:23:05 PM11/18/06
to nbear...@googlegroups.com
已经再次修正,你下载v3.3.4再测一下。
Reply all
Reply to author
Forward
0 new messages