【发布时间】:2011-03-06 22:23:39
【问题描述】:
我对 nhibernate 有了很多了解,但这似乎是我不了解发生了什么的最后一个障碍。那么问题来了。
我有一个基本的数据库结构:
Shows:
ID [Pk]
CountryID [Fk]
Name
Countries:
ID [Pk]
Name
CountryID 具有从节目到国家表主键的外键引用,并且国家已经填充了很少更改的预设值。
这是我的映射文件
public ShowMap()
{
Table("Shows");
Id(x => x.ID);
Map(x => x.Name)
HasOne<Country>(x => x.CountryOrigin)
.Cascade.All()
.ForeignKey("CountryID");
}
public CountryMap()
{
Table("Countries");
Id(x => x.ID);
Map(x => x.Name);
}
我几乎确定这是一个映射问题,但是当我插入节目时,我有一个国家/地区。 它尝试在数据库中插入一个新的国家,而不是使用数据库中已经存在的国家。 这似乎是主要问题。我不知道如何在使用数据库中现有记录的地方正确插入。
最后,这是我尝试插入不知道该怎么做的示例。
using (var tx = _session.BeginTransaction())
{
Show s1 = new Show();
s1.CountryOrigin = new Country { ID = 2, Name = "Japan" };
s1.Name = "Liar Game";
_session.SaveOrUpdateCopy(s1);
tx.Commit();
tx.Dispose();
return true;
}
所以问题是如何插入新节目并让它引用国家/地区表中的现有记录?
更新 1 我已对其进行了重新设计以使用多关系,因为我读到多关系可能不是正确的方法。仍然有同样的问题,这里是代码更改。这些也反映了 cmets 中的代码更改。
插入代码:
using (var tx = _session.BeginTransaction())
{
Show s1 = new Show();
s1.CountryOrigin.Add(_session.Get<Country>(2));
s1.Name = "Liar Game";
_session.SaveOrUpdateCopy(s1);
tx.Commit();
return true;
}
映射:
public ShowMap()
{
Table("Shows");
Id(x => x.ID);
Map(x => x.Name)
HasMany<Country>(x => x.CountryOrigin)
.KeyColumn("ID")
.Cascade.SaveUpdate();
}
public CountryMap()
{
Table("Countries");
Id(x => x.ID);
Map(x => x.Name);
}
仍然无法像其中一个 cmets 中提到的那样将 null 插入 CountryID。
更新 2 做一些测试/调试:
s1.CountryOrigin.Add(_session.Get<Country>(2));
做它应该做的并获得正确的国家,但问题发生在插入。所以这让我觉得这是更多的映射问题。
【问题讨论】:
-
只是一个迂腐的观点:你不需要
tx.Dispose()。using语句将为您调用Dispose()。 -
即使我在 tx.dispose 之后返回 true 也是如此吗?
标签: database nhibernate fluent-nhibernate