0

一意の制約を持つ多対 1 を使用して 1 対 1 の関係をマッピングすると、「AccountDetail に対して生成された null id」という例外が発生しました。

これが私のSQLテーブルです:

Account(Id, Name)
AccountDetail(AccountId, Remark)

AccountId は主キーと外部キーの両方です。

これが私のドメイン モデル (アカウントとアカウントの詳細) です。

public class Account
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }

    public virtual AccountDetail Detail { get; set; }

    public Account()
    {
        Detail = new AccountDetail
        {
            Account = this
        };
    }
}

public class AccountDetail
{
    public virtual int AccountId { get; set; }

    public virtual Account Account { get; set; }

    public virtual string Remark { get; set; }
}

マッピング (コードによる NHibenrate 3.3 マッピング):

class AccountMap : ClassMapping<Account>
{
    public AccountMap()
    {
        Table(typeof(Account).Name);

        Id(c => c.Id, m => m.Generator(Generators.Native));

        Property(c => c.Name);

        OneToOne(c => c.Detail, m =>
        {
            m.Constrained(true);
            m.Cascade(Cascade.All);
          m.PropertyReference(typeof(AccountDetail).GetPropertyOrFieldMatchingName("Account"));
        });
    }
}

class AccountDetailMap : ClassMapping<AccountDetail>
{
    public AccountDetailMap()
    {
        Table(typeof(AccountDetail).Name);

        Id(c => c.AccountId, m =>
        {
            m.Column("AccountId");
            m.Generator(Generators.Foreign<AccountDetail>(x => x.Account));
        });

        Property(c => c.Remark);

        ManyToOne(c => c.Account, m =>
        {
            m.Column("AccountId");
            m.Unique(true);
        });
    }
}

ところで: AccountDetail の AccountId プロパティを削除できますか? つまり、Account プロパティのみを使用します。AccountDetail クラスで AccountId と Account プロパティの両方を使用することは、オブジェクト指向ではないように見えます。

ありがとう!

4

1 に答える 1

1

実際に何が悪いのかはわかりませんが、1対1の関係で作業している場合と比較すると、次のようにマッピングします。

class AccountMap : ClassMapping<Account>
{
    public AccountMap()
    {
        Table(typeof(Account).Name);

        // creates a auto-counter column "id"
        Id(c => c.Id, m => m.Generator(Generators.Native));

        // doesn't require a column, one-to-one always means to couple primary keys.
        OneToOne(c => c.Detail, m =>
        {
            // don't know if this has any effect
            m.Constrained(true);

            // cascade should be fine
            m.Cascade(Cascade.All);
        });
    }
}

class AccountDetailMap : ClassMapping<AccountDetail>
{
    public AccountDetailMap()
    {
        Id(c => c.AccountId, m =>
        {
            // creates an id column called "AccountId" with the value from
            // the Account property.
            m.Column("AccountId");
            m.Generator(Generators.Foreign(x => x.Account));
        });

        // should be one-to-one because you don't use another foreign-key.
        OneToOne(c => c.Account);
    }
}
于 2012-05-14T13:43:06.047 に答える