Пользовательский атрибут KinSlayerUY работал хорошо для меня, но у меня были проблемы с ComplexTypes. Они были сопоставлены как сущности в коде атрибута, поэтому не могли затем отображаться как ComplexType.
Поэтому я расширил код, чтобы это можно было сделать:
public static void OnModelCreating(DbModelBuilder modelBuilder)
{
foreach (Type classType in from t in Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()
where t.IsClass && t.Namespace == "FA.f1rstval.Data"
select t)
{
foreach (var propAttr in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => p.GetCustomAttribute<DecimalPrecisionAttribute>() != null).Select(
p => new { prop = p, attr = p.GetCustomAttribute<DecimalPrecisionAttribute>(true) }))
{
ParameterExpression param = ParameterExpression.Parameter(classType, "c");
Expression property = Expression.Property(param, propAttr.prop.Name);
LambdaExpression lambdaExpression = Expression.Lambda(property, true,
new ParameterExpression[] { param });
DecimalPropertyConfiguration decimalConfig;
int MethodNum;
if (propAttr.prop.PropertyType.IsGenericType && propAttr.prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
MethodNum = 7;
}
else
{
MethodNum = 6;
}
//check if complextype
if (classType.GetCustomAttribute<ComplexTypeAttribute>() != null)
{
var complexConfig = modelBuilder.GetType().GetMethod("ComplexType").MakeGenericMethod(classType).Invoke(modelBuilder, null);
MethodInfo methodInfo = complexConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[MethodNum];
decimalConfig = methodInfo.Invoke(complexConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
}
else
{
var entityConfig = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(classType).Invoke(modelBuilder, null);
MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[MethodNum];
decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
}
decimalConfig.HasPrecision(propAttr.attr.Precision, propAttr.attr.Scale);
}
}
}
С ReadFile/WriteFile у Вас есть детерминированная семантика обработки ошибок. При использовании файлов с отображенной памятью ошибки возвращаются путем выдачи исключения.
, Кроме того, если файл с отображенной памятью должен поразить диск (или еще хуже, сеть) Ваше чтение памяти может занять несколько секунд (или даже минуты) для завершения. В зависимости от Вашего приложения это может вызвать неожиданные остановы.
при использовании ReadFile/WriteFile, можно использовать асинхронные варианты API, чтобы позволить Вам управлять этим поведением.
у Вас также есть более детерминированная производительность при использовании ReadFile, особенно если шаблон ввода-вывода предсказуем - ввод-вывод с отображенной памятью часто случаен, в то время как, поскольку ReadFile почти всегда последователен (так как чтения ReadFile в текущем положении файла и совершенствуют текущее положение файла).
Вам будет нужен более сложный код для установления файла, отображающегося, чем для того, чтобы просто открыться и читать. Отображение файла предназначается для произвольного доступа к разделу файла. Если Вам не нужно это, просто не беспокойтесь отображением файла.
Также, если когда-нибудь должен портировать Ваш код на другую платформу, Вы сделаете это намного легче и быстрее, если Вы не будете использовать отображение файла.
Большое преимущество отображения файлов в том, что оно не влияет на системный кеш. Если ваше приложение выполняет чрезмерное количество операций ввода-вывода с помощью ReadFile, ваш системный кеш будет расти, потребляя все больше и больше физической памяти. Если ваша ОС 32-разрядная и у вас намного больше 1 ГБ памяти, вам повезло, так как в 32-разрядной Windows размер системного кеша ограничен 1 ГБ. В противном случае системный кеш будет использовать всю доступную физическую память, и диспетчер памяти вскоре начнет очищать страницы от других процессов на диске, усиливая операции с диском, а не сокращая их. Эффект особенно заметен в 64-битной Windows, где размер кеша ограничен только доступной физической памятью. С другой стороны, отображение файлов не приводит к чрезмерному разрастанию системного кеша и, в то же время, не снижает производительность.