database - 使用 NHibernate 维护插入时的参照完整性

标签 database nhibernate fluent-nhibernate

我已经了解了很多关于 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 我已经对其进行了重新设计以使用 has many 关系,因为我读到 has one 可能不是正确的方法。仍然有同样的问题,这里是代码更改。这些也反射(reflect)了评论中的代码更改。

插入代码:

        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);
    }

仍然无法像其中一条评论中提到的那样将 null 插入 CountryID。

更新 2 进行一些测试/调试:

            s1.CountryOrigin.Add(_session.Get<Country>(2));

做了它应该做的并获得了正确的国家,但问题发生在插入时。所以这让我认为这是更多的映射问题。

最佳答案

你在国家和节目之间有一个一对多的关系,在多边上有节目。因此,应使用 References 映射国家/地区:

public ShowMap()
{
    Table("Shows");

    Id(x => x.ID);
    Map(x => x.Name)

    References(x => x.CountryOrigin, "CountryID");
}

关于database - 使用 NHibernate 维护插入时的参照完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3095257/

相关文章:

c# - 如何使用 Fluent NHibernate 映射包含与父类型相同类型的实体的列表?

nhibernate - 每个线程的 NHibernate session 是否与线程池一起使用?

nhibernate - 使用 Fluent NHibernate 使用两个非 FK 列连接到表

c# - NHibernate 尝试在不存在的列中查询

php - 通过 PHP 和 MySQL 插入 ID

如果值不为空,则更新数据库的 SQL 查询?

sql - 如何避免sql server中的游标?也想避免 while 循环

使用 ASP.NET MVC 3 的 NHibernate session + 事务

c# - Fluent Nhibernate 按条件映射到不同的列

mysql - 我应该在数据库中复制数据吗?