我正在制作一个通用的nhibernate方法,可以在运行时给定一个实例化的nhibernate映射对象,如果该对象被"数据库"中的某个其他对象引用.
这样,我将能够允许用户删除未被引用的对象,并抛出错误(如果有的话)(以及有关引用对象的内容的一些信息).
我碰到了一个障碍,当一个实体映射cascade = all时,我希望它们能够删除这个东西,即使其他对象引用它.
所以,我只需要知道如何使用Nhibernate.MetaData.IClassMetaData来确定'实体类型'或包是否为cascade = all.寻找几分钟后我似乎无法找到它.
有什么想法吗?
谢谢
艾萨克
PS这里是方法代码(未完成).IDomainObject只是确保传递的对象具有int ID属性.
public int getReferenceCount<T>(T objectToCheck) where T : Interfaces.IDomainObject
{
Type objectType = typeof(T);
string className = objectType.Name;
IDictionary<string, NHibernate.Metadata.IClassMetadata> myDictionary = session.SessionFactory.GetAllClassMetadata();
int referenceCount = 0;
string fullClassName = objectType.FullName;
foreach (var thisClassPair in myDictionary)
{
NHibernate.Metadata.IClassMetadata thisClass = thisClassPair.Value;
for (int i = 0; i < thisClass.PropertyTypes.Length; i++)
{
string propertyName;
if (thisClass.PropertyTypes[i].Name == fullClassName)
{
if (thisClass.PropertyTypes[i] is NHibernate.Type.ManyToOneType || thisClass.PropertyTypes[i] is NHibernate.Type.OneToOneType)
{
propertyName = thisClass.PropertyNames[i];
List<object> results = this.HQLQuery<object>("from " + thisClassPair.Key + " as refClass where refClass."+propertyName+".id = '"+objectToCheck.ID+"'");
}
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
var persister = (NHibernate.Persister.Entity.AbstractEntityPersister)thisClass;
var cascadeStyle = persister.GetCascadeStyle(i);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |