长篇故事 - 涉及外键的与nHibernate相关的删除

时间:2013-11-20 21:04:20

标签: sql nhibernate fluent-nhibernate

我们有2个表通过外键 Userid - ApiLog和User相关。基本上,我们无法从User表中删除ApiLog表中有任何记录的记录。是的,同意,对于外键关系来说是一个可怕的想法,但我们坚持使用它是因为我们无法改变的综合报告系统。这是一个继承的遗留应用程序/数据库,我们正在使用它作为起点,而且只有nHibernate熟练的工作人员早已不复存在。

我们还有一个特定于我们的应用程序的表AccountUser(许多应用程序使用用户表)。

有一个nHibernate实体AccountUser映射如下..

    public AccountUserMap()
    {
       this.Table("Users");
        this.Id(x => x.Id, m =>
            {
                m.Generator(Generators.Identity);
                m.Column("userID");
            });
        this.Property(x => x.FirstName);
        this.Property(x => x.LastName);
        this.Property(x => x.Email);
        this.Property(x => x.Phone);
        this.Join("accountuser", j =>
            {
                j.Fetch(FetchKind.Join);
                j.Key(x => x.Column("userID"));
                j.Property("AccountId", x => x.Column("accountId"));
            });
    }

现在标准的CRUD操作就像魅力一样。当我们需要从AccountUser表中删除一行时,问题就出现了(只有AccountUser,我们不修改User表)。我们不能使用AccountUser实体,因为映射涉及由于外键问题而无法删除的User表(User-ApiLog关系)。有人建议尝试使用nHibernate ISession.Delete ..

        using (ISession session = ConnectionManager.GetInstance().GetSession())
            using (ITransaction trans = session.BeginTransaction())
            {
               session.Delete("from AccountUser u where u.Id = " + id);
               trans.Commit();   
            }

但是抛出了外键约束错误,好像我们正在使用实体并修改User表一样(AccountUser和User之间没有db关系,只有AccountUser和User之间的程序关系)。

创建一个新的仅限AccountUser的实体,可以对AccountUser表进行删除,这很简单,但感觉很尴尬。因此,问题是,还有更好的方法吗?

0 个答案:

没有答案