Castle.ActiveRecord 多对多关系 引发的错误处理

在Castle.ActiveRecord 实体类中,如果两个对象有 “多对多” 关系,一般的做法是将其分解为 两个“一对多”关系,但有时引发了 “您要删除 或 引用 的对象#2在数据库中不存在”的异常

百思不得其解,同样的用法在“媒体引用”中一直都是正常的,为什么在“专题引用” 和“ Web栏目引用” 中就出现异常呢?

通过遍历代码发现了细微的差别:

在“媒体”的业务对象加载时,为了判断一个对象是否可以删除,常查询其被引用的 次数是多少,使用的方法是:DALMediaReference.FindCount(data)

在“专题”的业务对象加载时,为了判断一个对象是否可以删除,常查询其被引用的 次数是多少,使用的方法是:data.SubjectReferences != null && data.SubjectReferences.Count > 0

通过对比分析,“媒体”的检查使用是的 数据库 查询方法,最终会在数据中运行,而在“专题”中使用的是 “对象的引用” ,特别是在开启了数据加载缓存时,虽然数据库的引用已被删除,由于缓存存在的原因,内存中的引用(专题引用)对象未从引用列表(data.SubjectReferences)中删除,由于引用它的对象没有及时的维护两者的关系(删除时从两者的引用 关系中 删除),因此在  使用 data.SubjectReferences 语句时会加载 已从数据库中删除的对象。

原因显然已经找到,解决的办法有如下:

if (data.WebCategories != null && data.WebCategories.Count > 0)

{
  List<DALWebInformationCategory> tempWC = new List<DALWebInformationCategory>(data.WebCategories);
  foreach(var item in tempWC)
  {
     DALCategory _Category = item.Category;
     _Category.CategoryReferences.Remove(item);
     data.WebCategories.Remove(item);
     item.Delete();
  }
}

但也引入了另外的问题:

以上的解决方案 维护了缓存中的内存对象,通过ID取得对象时,不必执行数据库IO,因此性能较好,但必须在所有使用 “媒体引用”、“专题引用”这样的主对象执行删除操作时, 必须要增加代码来维护这些关系,因此增加了工作量,对于象“媒体引用”这样的对象来说,工程量相当浩大,并且也 造成了 代码侵入,使主对象过多的分心来处理这些逻辑,违反了 对象的 单一性原则。

通过 查询数据库 判断的方法,虽然在数据加载时都有一次数据库IO,带来了一定的性能损耗,但其 有效避免了上述缺点,因此还是比较理想的选择。

时间: 2024-10-06 00:45:00

Castle.ActiveRecord 多对多关系 引发的错误处理的相关文章

[掌眼]解决Castle.ActiveRecord在ASP.NET或WCF环境中HttpContext.Current无效的错误

AR設定檔要指定threadinfotype,不指定的話,預設值是用WebThreadScopeInfo,是用 HttpContext.Current.Items 來存放 SesionScope,所以碰到與UI無關的執行緒,沒有 HttpContext.Current 程式就掛啦. 解决方案一: 1.检查“web.config” <activeRecord isWeb="true" isDebug="false"> <config>... .

Castle ActiveRecord框架学习(一)

一.Active Record(活动记录)模式 Active Record是业务逻辑层中(<企业应用架构模式>将该模式归为数据源模式)常用的一种框架模式,尤其在底层数据库模型匹配业务模型时它特别有用,它是一种以数据库驱动为主的框架模式. 通常,数据库中的每张表都对应一个业务对象.业务对象表示表中的一行,并且包含数据.行为以及持久化该对象的工具,此外还有添加新实例和查找对象集合所需的方法. 在Active Record模式中,每个业务对象均负责自己的持久化和相关的业务逻辑. Active Rec

Castle ActiveRecord框架学习(二):快速搭建简单博客网站

一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据库关系图 3.简单说明 Category和Post表为多对多关系 Post和Comment表 为一对多关系 二.实体类 1.Category类: // 指定数据表,Lazy为延迟加载 [ActiveRecord("Category",Lazy=true)] public class Cat

jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系

四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库生成数据表: #django默认在makemigrations会为表对象创建主键id,id = models.AutoField(primary_key=True) 你也可以自定义一个主键对象: 4.2.1: 生成迁移文件python manage.py makemigrations 4.2.2执行

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片

Castle ActiveRecord学习(一)

简介 来源:http://www.cnblogs.com/zxj159/p/4082987.html 一.Active Record(活动记录)模式 Active Record是业务逻辑层中(<企业应用架构模式>将该模式归为数据源模式)常用的一种框架模式,尤其在底层数据库模型匹配业务模型时它特别有用,它是一种以数据库驱动为主的框架模式. 通常,数据库中的每张表都对应一个业务对象.业务对象表示表中的一行,并且包含数据.行为以及持久化该对象的工具,此外还有添加新实例和查找对象集合所需的方法. 在A

django之多对多关系

django 1.7 定义多对多关系,使用 ManyToManyFiled. 本例中,文章Article可以在多个出版物Publication上发表,而出版物可以有多个文章对象. from django.db import models class Publication(models.Model): title = models.CharField(max_length=30) def __str__(self): return self.title class Meta: ordering

Hibernate映射(二)——多对一关系映射

上篇学习了Hibernate的基本映射,也就是单表映射,很容易就能理解,但是对于关系数据库来说,表之间存在关系是比不可少的,关系数据库中存在的关系是通过主外键建立起来的,反应到Hibernate要如何通过对象表现呢?下面我们就继续学习Hibernate的对象关系映射. 我们先从最常见的多对一和一对多关系开始: 多对一 所谓多对一,在数据库中即在多的一端添加外键关联到一的一端,比如用户(User)和用户所在组(Group)的关系:一个User只属于一个Group,一个Group有多个Group,并

关联映射 ---- Hibernate之多对多关系

叙:上一章详细的记录了关联映射中的"一对多|多对一"关系.级联操作.关系的维护等知识点,本章节轻风学习记录的是级联关系中的"多对多"关系: Hibernate的"多对多"级联关系 1. 介绍 在生活中很多关系都是多对多的,比如一个人在公司是技术部的同时也是营销部的(只是个例子),所以,多对对关系是很普遍的,一个对象有多个角色,而一个角色又可以有多个对象,因此最正确的做法是在对象与角色之间创建一个新的表,用来保存对象和角色的主键,方便调用查看相应的