我有一个映射到公司类的公司表和一个映射到网站类的网站表。我的公司表基本上是不动的,但是我试图插入一个新的网站记录,其中包含以下内容:
var website = new Website
{
Active = true,
SiteRoot = "example.com",
CompanyId = 100
};
var repo = new WebsiteRepository();
repo.Add(website);
网站类有一个CompanyId属性,该属性映射回Companies表中的ID列,但由于Website类具有多对一映射,因此它试图插入{{1表中的属性(为null),而不是取website.Company.Id
属性。
没有涉及外键,因为表位于2个独立的数据库中。
这是我收到的错误:
NHibernate.Exceptions.GenericADOException:无法插入:[Models.Website] [SQL:INSERT INTO Database1.dbo.Websites(CompanyID,SiteRoot,Active)VALUES(?,?,?);选择SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException:无法将值NULL插入列' CompanyID',table' Database1.dbo.Websites&#39 ;;列不允许空值。 INSERT失败。
NHibernate:INSERT INTO Database1.dbo.Websites(CompanyID,SiteRoot,Active)VALUES(@ p0,@ p1,@ p2);选择SCOPE_IDENTITY(); @ p0 = NULL [类型:Int32(0)],@ p1 =' example.com' [Type:String(4000)],@ p2 = True [Type:Boolean(0)]
以下是映射:
website.Id
答案 0 :(得分:1)
您需要将公司分配给Company属性以实现多对一关系。像这样:
var website = new Website
{
Active = true,
SiteRoot = "example.com",
Company = session.Load(100);
};
或者,如果您愿意,请使用存储库:
var website = new Website
{
Active = true,
SiteRoot = "example.com",
Company = CompanyRepository.Get(100);
};
注意:强>
session.Load
不会从数据库加载任何内容。它只创建一个代理。这非常有效。最后,它只为外部密钥为100的网站创建一个INSERT语句,而不会丢失代码中面向对象的编程风格。
永远不要访问类模型中的外键。外键由NHibernate管理,在面向对象的模型中不存在。
答案 1 :(得分:0)
通过将多对一映射设置为insert =“false”和update =“false”来修复它,然后将CompanyId属性添加到网站映射中。