Fluent nhibernate Fluent Nhibernate一对一映射问题

Fluent nhibernate Fluent Nhibernate一对一映射问题,fluent-nhibernate,fluent-nhibernate-mapping,Fluent Nhibernate,Fluent Nhibernate Mapping,我必须要有桌子,桌子上的人和个人资料。个人资料的主键为FK。 我还有两门课: public class Person { public int Id { get;set; } public Profile Profile { get;set; } } public class Profile { Public int PersonId { get;set; } Public string Language { ge

我必须要有桌子,桌子上的人和个人资料。个人资料的主键为FK。 我还有两门课:

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();
    }
}
现在,当更新现有配置文件对象时,它可以正常工作,但当尝试插入新配置文件时,我得到:

无法执行批处理命令。[SQL:SQL不可用]

调试时PersonId为Profile对象为0

我怎样才能解决这个问题


提前感谢

您告诉NH您正在维护自己生成的一对一

要么将其映射为OneTONE

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();
    }
}
或者将配置文件映射为Person的组件

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();
        }
    }
}

嗨,菲罗,我也试过Idx=>x.PersonId.GeneratedBy.ForeignPerson,通过首先在配置文件中添加Person属性,当该人员在数据库中已经有“配置文件”时,这可以正常工作,但在尝试使用新配置文件保存人员时,即时消息:“无法解析属性:Person”……配置文件中的Person为null,PersonId为0当您将新配置文件分配给某人时,您必须在配置文件中设置Person属性,否则NH无法保存配置文件,因为它无法确定正确的id,因为该人未设置。Firo,如果您在ProfileMap中说:Idx=>x.PersonId.GeneratedBy.ForeignPerson。。。这不意味着个人资料的PersonId将自动分配吗?当此人已经拥有个人资料时,就会发生这种情况。。为什么不在个人没有个人资料时设置呢?GeneratedBy.ForeignPerson意味着NH将在Person.Id设置之后设置PersonId=Person.Id,因此必须将property Person设置为个人资料所属的人。好的,谢谢你。还有一个问题是,当我尝试你的第二个建议加入时,我收到此错误:命名空间“urn:nhibernate-mapping-2.2”中的元素“class”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“joined subclass”。需要的可能元素列表:命名空间“urn:nhibernate-mapping-2.2”中的“join、subclass、loader、sql insert、sql update、sql delete、filter、resultset、query、sql query”。