Fluent nhibernate Fluent NHibernate:外键冲突或空值
嘿,伙计们,我在使用fluent nhibernate进行映射时遇到了一些实际问题。我意识到在这个网站和其他网站上都有很多关于特定类型地图的帖子,但到目前为止,我还没有找到解决我问题的方法 以下是我所拥有的:Fluent nhibernate Fluent NHibernate:外键冲突或空值,fluent-nhibernate,nhibernate-mapping,Fluent Nhibernate,Nhibernate Mapping,嘿,伙计们,我在使用fluent nhibernate进行映射时遇到了一些实际问题。我意识到在这个网站和其他网站上都有很多关于特定类型地图的帖子,但到目前为止,我还没有找到解决我问题的方法 以下是我所拥有的: namespace MyProject.Models.Entites { public class Project { public virtual Guid Id {get; set;} // A load of other propertie
namespace MyProject.Models.Entites
{
public class Project
{
public virtual Guid Id {get; set;}
// A load of other properties
public virtual ProjectCatagory Catagory{get;set;}
}
}
然后是地图:
namespace MyProject.DataAccess.ClassMappings
{
public class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Id(x => x.Id);
Map(x => x.Title);
Map(x => x.Description);
Map(x => x.LastUpdated);
Map(x => x.ImageData).CustomSqlType("image");
HasOne(x => x.Catagory);
}
}
}
及其地图:
public ProjectCatagoryMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
问题是,好吧,它不起作用!在单元测试中,我将执行与以下类似的操作:
Project myproject = new Project("Project Description");
// set the other properties
myProject.Catagory = new ProjectCatagory(Guid.New(), "Test Catagory");
repository.Save(myProject);
现在,我尝试了许多映射和数据库配置,以使其正常工作。目前,项目数据库表有一个列“Catagory_id”(我没有放在那里,我假设NH添加它是映射的结果),我希望它设置为不允许空值。但是,当设置为这样时,会出现异常,说明无法将null值插入表中(即使在调试期间,我已检查了项目对象上的所有属性,并且它们不是null)
或者,我可以允许表在该列中接受空值,它只需保存项目对象,并在保存时完全忽略Category属性,因此,在检索时,测试是否与项目关联了正确的类别失败
如果我没记错的话,我曾经使用过ProjectMap:
References(x => x.Catagory).Column("Catagory_id").Cascade.All().Not.Nullable();
这将异常从“无法插入空值”更改为外键冲突
我怀疑所有这些麻烦的根源是我对关系数据库设置缺乏了解,因为我在这个项目中有其他实体,它们没有外部依赖关系,与NHibernate一起工作绝对正常,排除了创建存储库时可能导致的任何编码问题
非常感谢您的帮助。谢谢。这里的主要问题是对关系数据库中的“一对一”关系和Fluent中的
HasOne
映射的常见误解。映射中的术语是关系术语。(Fluent试图稍微“美化”他们,这在我看来更糟。HasOne
的实际意思是:一对一。)
请看一下:
哈桑通常是为一个年轻人保留的
特例。一般来说,你会使用
大多数情况下的引用关系
情境(见:我想你指的是
多对一)
解决方案非常简单,只需将HasOne
与References
交换(one-to-to多对一
在XML映射文件中)。您在数据库中获得一个外键,该外键引用了项目分类
关系数据库中真正的一对一关系理想地由主键同步映射。当两个对象共享同一个主键时,就不会为额外的外键浪费空间,而且可以确保外键是一对一的
要同步主键,您需要将一个密钥连接到其他密钥。然而,这并不是您需要的。这里的主要问题是对关系数据库中的“一对一”关系和Fluent中的HasOne
映射的常见误解。映射中的术语是关系术语。(Fluent试图稍微“美化”他们,这在我看来更糟。HasOne
的实际意思是:一对一。)
请看一下:
哈桑通常是为一个年轻人保留的
特例。一般来说,你会使用
大多数情况下的引用关系
情境(见:我想你指的是
多对一)
解决方案非常简单,只需将HasOne
与References
交换(one-to-to多对一
在XML映射文件中)。您在数据库中获得一个外键,该外键引用了项目分类
关系数据库中真正的一对一关系理想地由主键同步映射。当两个对象共享同一个主键时,就不会为额外的外键浪费空间,而且可以确保外键是一对一的
要同步主键,您需要将一个密钥连接到其他密钥。然而,这是可行的,它不是您在这里需要的。在使用了所有可用的映射选项之后。我发现答案与建议的相似
正如人们所怀疑的那样,HasOne()
显然是错误的,References(x=>x.Catagory)
是解决方案的一部分。但是,我仍然收到外键冲突异常,直到:
References(x => x.Catagory).Column("Catagory_id").Cascade.SaveUpdate().Not.Nullable().Not.LazyLoad();
我只是想更新线程,以防其他人遇到类似的问题,因为仅仅使用References()
不起作用。在使用所有可用的映射选项后。我发现答案与建议的相似
正如人们所怀疑的那样,HasOne()
显然是错误的,References(x=>x.Catagory)
是解决方案的一部分。但是,我仍然收到外键冲突异常,直到:
References(x => x.Catagory).Column("Catagory_id").Cascade.SaveUpdate().Not.Nullable().Not.LazyLoad();
我只是想更新线程,以防其他人遇到类似的问题,因为仅仅使用References()
不起作用。它的ProjectCatagory类似乎是Project类的父类。因此,没有父类,子类如何存在
你必须使用-
参考文献(x=>x.Catagory)。列(“Catagory_id”)。外键(“id”)
这里的外键是您的ProjectCatagory表ID。它的ProjectCatagory类似乎是Project类的父类。因此,没有父类,子类如何存在
你必须使用-
参考文献(x=>x.Catagory)。列(“Catagory_id”)。外键(“id”)
这里外键是您的ProjectCatagory表ID。请将标题更改为“Fluent NHibernate:HasOne问题”以使其更具体。请将标题更改为“Fluent NHibernate:HasOne问题”以使其更具体。我意识到“HasOne()”在这些术语中实际上是错误的,但正如文章底部所说,我尝试过简单地使用“R”