2013-04-13 4 views
0

У меня есть следующий код, позволяющий PostSharp автоматически устанавливать свойство (внешний ключ), когда установлено его свойство навигации (помечено с помощью ForeignKeyAttribute).Как я могу предотвратить получение кода кода во время десериализации?

Код очень медленный при десериализации большого количества объектов, поэтому я хочу знать, есть ли способ предотвратить запуск кода во время десериализации.

У кода все еще есть несколько отверстий в нем, я все еще работаю над ним, но сначала я использую код рамки сущности в отключенной среде, и у меня нет dbcontext для этого.

Благодаря Craig

[Serializable] 
public class ForeignKeySynchronisationAttribute : LocationInterceptionAspect 
{ 
    public override void OnSetValue(LocationInterceptionArgs args) 
    { 
     try 
     { 
      var foreignKeyIdSet = false; 
      var entity = args.Instance; 
      var propertyInfo = args.Location.PropertyInfo; 

      if (typeof(BaseEntity).IsAssignableFrom(propertyInfo.PropertyType)) 
      { 
       // First look for metadata defined ForeignKeyAttribute 
       var metadata = 
        entity.GetType() 
          .GetCustomAttributes(typeof(MetadataTypeAttribute), true) 
          .OfType<MetadataTypeAttribute>() 
          .FirstOrDefault(); 

       if (metadata != null) 
       { 
        var metadataProperty = metadata.MetadataClassType.GetProperty(propertyInfo.PropertyType.Name); 

        if (metadataProperty != null) 
        { 
         var foreignKeyAttribute = metadataProperty.GetCustomAttributes<ForeignKeyAttribute>().First(); 

         if (foreignKeyAttribute != null) 
         { 
          var foreignKeyIdPropertyInfo = entity.GetType().GetProperty(foreignKeyAttribute.Name); 

          foreignKeyIdPropertyInfo.SetValue(entity, ((BaseEntity)args.Value).PrimaryKey); 
          foreignKeyIdSet = true; 
         } 
        } 
       } 

       // Then look for normally defined ForeignKeyAttribute 
       if (!foreignKeyIdSet) 
       { 
        var foreignKeyAttribute = propertyInfo.GetCustomAttributes<ForeignKeyAttribute>().First(); 

        if (foreignKeyAttribute != null) 
        { 
         var foreignKeyIdPropertyInfo = entity.GetType().GetProperty(foreignKeyAttribute.Name); 
         foreignKeyIdPropertyInfo.SetValue(entity, ((BaseEntity)args.Value).PrimaryKey); 
        } 
       } 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      base.OnSetValue(args); 
     } 
    } 
} 

ответ

0

Пожалуйста, обратите внимание, что я так сделал то, что я требовал с помощью другого метода.

Приветствия

Craig

Смежные вопросы