使用实体框架的StructuralTypeConfiguration.Ignore()忽略所有属性,但指定集合 [英] Use Entity Framework's StructuralTypeConfiguration.Ignore() to Ignore all properties but specified set

查看:240
本文介绍了使用实体框架的StructuralTypeConfiguration.Ignore()忽略所有属性,但指定集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在EF codeFirst流利的API,我可以这样写:

In EF CodeFirst Fluent API I can write something like this:

modelBuilder.Entity<MyEntity>()
            .Ignore(e => e.Property1);
modelBuilder.Entity<MyEntity>()
            .Ignore(e => e.Property2);

如何忽略所有的性质在,但一个小小的设置,像这样的:

How to ignore all properites but a tiny set, like this:

modelBuilder.Entity<MyEntity>()
            .IgnoreAllBut(e => e.ID, e => e.Important);

是否有可能写出这样的扩展方法 IgnoreAllBut

推荐答案

这是草案,但工作原理:

This is draft, but works:

public static void IgnoreAllBut<TStructuralType>(
    this StructuralTypeConfiguration<TStructuralType> configuration,
    params Expression<Func<TStructuralType, object>>[] includes)
    where TStructuralType : class
{
    var includeMembers = ConvertExpressionsToMembers(includes);
    var type = typeof(TStructuralType);
    var properties = type.GetProperties();
    var typeParameter = Expression.Parameter(type);
    var configurationType = configuration.GetType();
    var ignoreMethod = configurationType.GetMethod("Ignore");
    foreach (var property in properties)
    {
        if (!includeMembers.Any(member => member.Name == property.Name))
        {
            var propertyExpression = Expression.Property(typeParameter, property);
            var lambdaExpression = Expression.Lambda(propertyExpression, typeParameter);
            var genericIgnoreMethod = ignoreMethod.MakeGenericMethod(property.PropertyType);
            var parameters = new object[] { lambdaExpression };
            genericIgnoreMethod.Invoke(configuration, parameters);
        }
    }
}

private static List<MemberInfo> ConvertExpressionsToMembers<TStructuralType>(
    Expression<Func<TStructuralType, object>>[] expressions)
{
    var members = new List<MemberInfo>();
    foreach (var lambda in expressions)
    {
        var expression = lambda.Body;
        var memberExpression = expression as MemberExpression;
        if (memberExpression == null)
        {
            var unaryExpression = expression as UnaryExpression;
            memberExpression = unaryExpression.Operand as MemberExpression;
        }
        members.Add(memberExpression.Member);
    }
    return members;
}

感谢深灰为code在链接<一个href="http://stackoverflow.com/questions/9621736/how-to-convert-propertyinfo-to-property-ex$p$pssion-and-use-it-to-invoke-generic">question.

这篇关于使用实体框架的StructuralTypeConfiguration.Ignore()忽略所有属性,但指定集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆