У меня есть следующий код, позволяющий 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);
}
}
}