NHibernate使用null多对一映射插入新记录

时间:2016-06-01 22:45:15

标签: c# sql-server nhibernate

我有一个映射到公司类的公司表和一个映射到网站类的网站表。我的公司表基本上是不动的,但是我试图插入一个新的网站记录,其中包含以下内容:

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

2 个答案:

答案 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属性添加到网站映射中。