Fluent nhibernate Fluent Nhibernate一对一映射问题
我必须要有桌子,桌子上的人和个人资料。个人资料的主键为FK。 我还有两门课: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
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”。