我们有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表进行删除,这很简单,但感觉很尴尬。因此,问题是,还有更好的方法吗?