0

私はテーブル、テーブルの人とプロフィールをしなければなりません。プロファイルには、FKとしてPersonのPKがあります。また、2つのクラスがあります。

public class Person
{
  public int Id
  { 
    get;set;
  }

  public Profile Profile
  { 
    get;set;
  }
}

public class Profile
{
  Public int PersonId
  {
    get;set;
  }

Public string Language
  {
    get;set;
  }
}

私のマッピングは:

public class ProfileMap : ClassMap<Profile>
{

    public ProfileSettingsMap()
    {
        Id(x => x.PersonId).GeneratedBy.Assigned();
        Map(x => x.Language, "LanguageId");
    }
}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        HasOne(p => p.ProfileSettings).Cascade.All();
    }
}

これで、既存のProfileオブジェクトを更新する場合は正常に機能しますが、新しいProfileを挿入しようとすると、次のようになります。

バッチコマンドを実行できませんでした。[SQL:SQLを使用できません]

PersonId is Profileオブジェクトは0です(デバッグ時)

どうすればこれを修正できますか?

前もって感謝します

4

1 に答える 1

0

NH に、自分で 1 対 1 を維持していることを伝えます ( GeneratedBy.Assigned())

onetoone としてマップするか

public class ProfileMap : ClassMap<Profile>
{

    public ProfileMap()
    {
        Id(x => x.PersonId).GeneratedBy.Foreign("Person"); // assuming you have a reference to Person in Profile
        Map(x => x.Language, "LanguageId");
    }
}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        HasOne(p => p.ProfileSettings).Cascade.All();
    }
}

またはプロファイルを個人のコンポーネントとしてマップします

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Join("Profiles", join => 
        {
            join.Component(p => p.ProfileSettings, c =>
            {
                c.Map(x => x.LanguageId);
            });
        }
    }
}

更新: コンソール アプリのこのコードは、FNH 1.2 で動作します

public class Person
{
    public virtual int Id { get; set; }
    public virtual Profile Profile { get; set; }
}

public class Profile
{
    public virtual int RecordsPerPage { get; set; }
}

public class PersonMap : ClassMap<Person>
{ 
    public PersonMap()
    { 
        Id(x => x.Id).GeneratedBy.Identity();
        Join("Profile", join =>
        {
            join.Component(p => p.Profile, c =>
            {
                c.Map(x => x.RecordsPerPage, "RecordsPerPage");
            });
        });
    }
}

static void Main(string[] args)
{
    var config = Fluently.Configure()
        .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
        .Mappings(m => m.FluentMappings.Add<PersonMap>())
        .BuildConfiguration();

    using (var sf = config.BuildSessionFactory())
    using (var session = sf.OpenSession())
    {
        new SchemaExport(config).Execute(true, true, false, session.Connection, null);

        using (var tx = session.BeginTransaction())
        {
            session.Save(new Person { Profile = new Profile { RecordsPerPage = 5 } });
            tx.Commit();
        }
    }
}
于 2012-05-03T06:41:40.933 に答える