-1

没有问题;我只是好奇 FluentNHibernate/NHibernate 如何知道要访问哪些行。

在以下伪代码中,我有这些实体:

public class User
{
    public virtual int Id { get; protected set; }
    public virtual IList<Friend> Friends { get; set; }
}   

public class Friend
{
    public virtual int Id { get; protected set; }
    public virtual User User { get; set; }
    public virtual String FunnyProperty { get; set; }
}

与这种一对多的关系:

public class UserMap : ClassMap<User>
{
    Id(x => x.Id);
    // One user has many friends
    HasMany(x => x.Friends).KeyColumn("UserId")...
}    

public class FriendMap : ClassMap<Friend>
{
    Id(x => x.Id);
    References(x => x.User, "UserId")... 
}

如果我运行以下代码来建立双向关系:

var user = new User().Friends.AddRange( /* 5 friends */ );
/* 5 friends */.ForEach(friend => friend.User = user);

然后设置:

user[2].FunnyProperty = "a magic string";

然后,在可视化数据库资源管理器工具中,我将表用户视为:


ID
--------------------------------------
63
--------------------------------------

和表Friends为:


身份证 | 用户名 | 有趣的属性
--------------------------------------
24 | 63 | (空值)
--------------------------------------
25 | 63 | (空值)
--------------------------------------
26 | 63 | 一根魔线
--------------------------------------
27 | 63 | (空值)
--------------------------------------
28 | 63 | (空值)
--------------------------------------

FluentNHibernate/NHibernate 如何“记住” id 26作为 中的第三个Friend对象user.Friends?假设您提交事务,在其他地方开始另一个事务,然后检索相同的user.Friends[2]. FluentNHibernate/NHibernate 如何知道访问id 为 26的行?

尤其是当您有一个Friends表,其中有许多不同的用户浮动时,如下所示,FluentNHibernate/NHibernate 如何“记住”要访问哪一行?:


身份证 | 用户名 | 有趣的属性
--------------------------------------
24 | 24 | (空值)
--------------------------------------
25 | 89 | (空值)
--------------------------------------
26 | 66 | 一根魔线
--------------------------------------
27 | 12 | (空值)
--------------------------------------
28 | 66 | (空值)
--------------------------------------
28 | 89 | (空值)
--------------------------------------

4

2 回答 2

1

您的 Friends 表包含属性 UserId,它是对朋友的引用。Fluent NHibernatie 会读取您定义的映射。

于 2012-09-25T07:45:59.030 回答
1

Friends 表中还有一个索引列。

于 2012-09-25T13:52:32.833 回答