Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate事件侦听器深度克隆对象_C#_Events_Nhibernate_Reflection - Fatal编程技术网

C# NHibernate事件侦听器深度克隆对象

C# NHibernate事件侦听器深度克隆对象,c#,events,nhibernate,reflection,C#,Events,Nhibernate,Reflection,我试图在OnPostUpdate事件中获取更新实体的旧状态。@event参数的OldState属性将对象作为数组返回,我需要它作为对象。我尝试了以下方法: public class EventListener : IPostUpdateEventListener { public void OnPostUpdate(PostUpdateEvent @event) { // Get the property names to align with the indexes o

我试图在OnPostUpdate事件中获取更新实体的旧状态。@event参数的OldState属性将对象作为数组返回,我需要它作为对象。我尝试了以下方法:

public class EventListener : IPostUpdateEventListener {
    public void OnPostUpdate(PostUpdateEvent @event) {
        // Get the property names to align with the indexes of the old state
        var propertyNames = @event.Persister.PropertyNames;

        // Get the original entity values
        var type = @event.Entity.GetType();
        var original = Activator.CreateInstance(type);

        // Set the values
    for (var i = 0; i < @event.OldState.Length; i++) {
        // Get the property and value
        var property = type.GetProperty(@event.Persister.PropertyNames[i]);
        var value = @event.OldState[i];

        if (property.CanWrite && !(@event.Persister.PropertyTypes[i] is CollectionType)) {
            if (value != null && (@event.Persister.PropertyTypes[i] is ComponentType || @event.Persister.PropertyTypes[i] is EntityType))
                property.SetValue(original, CloneObject(value));
            else
                property.SetValue(original, value);
        }
    }
}
我要做的第一件事是循环原始对象中的属性,然后尝试处理组件和引用类型(忽略列表)。这将正确复制对象。但是,它会抛出错误:

flush()未处理集合[Models.ContentType.Tags]

编辑:ContentType类是我正在更新的一个属性的类型。以下是它的实现,以防有所帮助:

public class ContentType : Entity<int> {
    public virtual string Name { get; set; }

    public virtual IList<ContentTag> Tags { get; set; }

    public ContentType() {
        Tags = new List<ContentTag>();
    }
}
公共类ContentType:实体{
公共虚拟字符串名称{get;set;}
公共虚拟IList标记{get;set;}
公共内容类型(){
标签=新列表();
}
}
当我尝试获取其他实体的旧状态时,也会遇到类似的错误。如果有人能告诉我正确的方法,我将不胜感激。谢谢

编辑

尽管您似乎没有接触任何收藏,但关于此问题:

您可以尝试这个答案,以确保它不是问题的原因:


知道触发错误的行将非常有帮助

还有
property.SetValue(target,CloneObject(value))中的
CloneObject

您是否尝试过将两行
var value=…
移动到相应的
if
语句中?这样,您将仅在真正需要时处理该值

    var value = @event.OldState[i];

    if (property.CanWrite && !(@event.Persister.PropertyTypes[i] is CollectionType)) {
        if (value != null && (@event.Persister.PropertyTypes[i] is ComponentType || @event.Persister.PropertyTypes[i] is EntityType))
成为

    if (property.CanWrite && !(@event.Persister.PropertyTypes[i] is CollectionType)) {
        var value = @event.OldState[i];
        if (value != null && (@event.Persister.PropertyTypes[i] is ComponentType || @event.Persister.PropertyTypes[i] is EntityType))

成为

    if (property.CanWrite && (property.PropertyType == typeof(string) || !typeof(IEnumerable).IsAssignableFrom(property.PropertyType)) && !property.PropertyType.IsInterface) {
        var value = property.GetValue(source, null);
        if (value != null && typeof(IEntity).IsAssignableFrom(property.PropertyType))
编辑

尽管您似乎没有接触任何收藏,但关于此问题:

您可以尝试这个答案,以确保它不是问题的原因:


知道触发错误的行将非常有帮助

还有
property.SetValue(target,CloneObject(value))中的
CloneObject

您是否尝试过将两行
var value=…
移动到相应的
if
语句中?这样,您将仅在真正需要时处理该值

    var value = @event.OldState[i];

    if (property.CanWrite && !(@event.Persister.PropertyTypes[i] is CollectionType)) {
        if (value != null && (@event.Persister.PropertyTypes[i] is ComponentType || @event.Persister.PropertyTypes[i] is EntityType))
成为

    if (property.CanWrite && !(@event.Persister.PropertyTypes[i] is CollectionType)) {
        var value = @event.OldState[i];
        if (value != null && (@event.Persister.PropertyTypes[i] is ComponentType || @event.Persister.PropertyTypes[i] is EntityType))

成为

    if (property.CanWrite && (property.PropertyType == typeof(string) || !typeof(IEnumerable).IsAssignableFrom(property.PropertyType)) && !property.PropertyType.IsInterface) {
        var value = property.GetValue(source, null);
        if (value != null && typeof(IEntity).IsAssignableFrom(property.PropertyType))

您有什么问题?每当更新实体时,我都会收到错误“集合[Models.User.Addresses]未由flush()处理”。您有什么问题?每当更新实体时,我都会收到错误“集合[Models.User.Addresses]未由flush()处理”。谢谢,我更新了我的问题。CloneObject是私有方法的正确名称。我正在合并来自早期版本的新解决方案,可能没有重命名其中一个实例。不过,我已经照你说的做了,但问题仍然存在。我已使用ContentType类编辑了我的问题,该类是我正在更新的实体的属性。感谢我将修补程序应用于IFlushEventListener,从而清除了此错误。然而,后来我遇到了另一个问题。因为这不是原始问题的一部分,我将把它标记为答案。谢谢谢谢我更新了我的问题。CloneObject是私有方法的正确名称。我正在合并来自早期版本的新解决方案,可能没有重命名其中一个实例。不过,我已经照你说的做了,但问题仍然存在。我已使用ContentType类编辑了我的问题,该类是我正在更新的实体的属性。感谢我将修补程序应用于IFlushEventListener,从而清除了此错误。然而,后来我遇到了另一个问题。因为这不是原始问题的一部分,我将把它标记为答案。谢谢