2

ユーザーからUserDetailsテーブルへの1対1のマッピングを設定しようとしています。データベースに次のテーブルがあるとします。

Users:

- UserID (PK, Identity)
- UserName
- Password

UsersDetails:

- UserID (PK, FK)
- FirstName
- LastName

次のpocoクラスを作成しました。

public class User {
    public virtual int UserID { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual UserDetails Details { get; set; }
}

public class UserDetails {
    public virtual int UserID { get; set; }
    public virtual User User { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }

    public UserDetails() {
    }

    public UserDetails(User user) {
        User = user;
    }
}

流暢にマッピングされているもの(xmlマッピングは非常に似ていることに注意してください。知っているのがxmlマッピングだけの場合でも、ガイダンスをいただければ幸いです):

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.UserID);
        Map(x => x.UserName);
        Map(x => x.Password);
        HasOne(x => x.Details)
            .Constrained()
            .Cascade.All();
    }
}

public class UserDetailsMap : ClassMap<UserDetails> {
    public UserDetailsMap() {
        Table("UsersDetails");
        Id(x => x.UserID)
            .GeneratedBy.Foreign("User");
        HasOne(x => x.User)
            .Constrained();
        Map(x => x.FirstName);
        Map(x => x.LastName);
    }
}

すべてが正しく表示されますが、私が言う場合:

var user = new User() { UserName = "Test", Password = "Test" };
user.Details = new UserDetails(user) { FirstName = "Test", LastName = "Test" };
session.Save(user);

エラーが発生します:

"NHibernate.Id.IdentifierGenerationException:null idが生成されました:UserDetails。"

誰かが私が間違ったことを見せてくれたら本当にありがたいです。ありがとう

編集: JamieIdeの提案の礼儀。ユーザーマッピングを次のように変更しました。

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.UserID);
        Map(x => x.UserName);
        Map(x => x.Password);
        References(x => x.Details, "UserID")
            .Class<UserDetails>()
            .Unique();
    }
}

しかし、ユーザーを挿入すると、次のエラーが発生します。

System.ArgumentOutOfRangeException:インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります。」

参照にCascade.All()を追加すると、生成されたnullIDについて取得していた元のエラーが表示されます。

4

5 に答える 5

2

ConstrainedUserMapではなく、UserDetailsMapでのみ指定する必要があると思います。試す:

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.UserID);
        Map(x => x.UserName);
        Map(x => x.Password);
        HasOne(x => x.Details)
            .Cascade.All();
    }
}

編集:

これこれを参照してください。遅延読み込みを1対1で機能させるには、ユーザー側から1対1で、UserDetails側から1対1で関係をマッピングする必要があるようです。これがNH3で違うかどうかはわかりません。

于 2011-01-12T02:45:29.727 に答える
0

さらに調査したところ、これはバージョン2.0では機能しないようです。私は今、バージョン3.0にアップグレードする立場にあり、これが可能になったと信じています。

于 2011-05-23T10:33:10.423 に答える
0

IDプロパティをマッピングする方法が正しいかわかりません。自動インクリメントされたIDである必要はなく、マッピングは次のようになります。

Id(x=>x.UserId);

フォーリンを使用する背後にある考え方と、それがここでどのように適合するのかわかりません。その背後にあるロジックを説明していただけますか?

于 2011-01-11T17:42:08.573 に答える
0

UserDetailsとUserDetailsのネイティブマッピングではなく、Userマッピングに外部キーIDマッピングを含める必要があると思います。しかし、私はそれの参照を見つけることができませんでした。

于 2011-01-11T21:11:32.360 に答える
0

http://gorbach.wordpress.com/2010/09/24/fluent-onetoone/

HasOne(x => x.Details).Cascade.All().ForeignKey("UserDetails");
HasOne(x => x.User).Constrained();
var user = new User() { UserName = "Test", Password = "Test" };
user.Details = new UserDetails(user) { FirstName = "Test", LastName = "Test" };
user.Details.User = user;
session.Save(user);
于 2011-02-14T06:54:46.310 に答える