0
public class MovieTotal:DbContext
{
    public DbSet<Movie> Movies { get;set; }
    public DbSet<Person> Persons { get; set;}

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        Movie mov = new Movie();
        modelBuilder.Entity<Movie>().Property(GetPropert("MovieName")).HasColumnName("Actors");
    }

    public System.Linq.Expressions.Expression<Func<Movie,string>> GetPropert(string  properName)
    {
        // Func<Movie, string> dele = 
        System.Linq.Expressions.Expression<Func<Movie, string>> exp = k => (string)(typeof(Movie).GetProperty(properName).GetValue(k, null));
        return exp ;
    }

    public string GetColumnName(string value)
    {
        return "Actors";
    }

    public MovieTotal()
    {   
        this.Database.Connection.ConnectionString = @"Data Source=(local);Initial Catalog=MovieTotal6;Integrated Security=SSPI;";
    }
}

这是错误消息:

表达式 'k => Convert(Movie.GetProperty(value(MovieTotal+ <>c__DisplayClass0).properName).GetValue(k, null))' 不是有效的属性表达式。它必须采用“e => e.Property[.Property]”的形式。

4

1 回答 1

0

验证传递给 Property 方法的表达式是一个 MemberExpression,其 .Member 属性是一个 PropertyInfo。如果不是您看到的异常,将被抛出。您可以在此处找到执行此操作的实际代码:http: //entityframework.codeplex.com/SourceControl/changeset/view/7fb31c1526d0#src%2fEntityFramework%2fUtilities%2fExpressionExtensions.cs(寻找 GetSimplePropertyAccess 方法)现在 Property() 方法采用 Expression 的原因不是让人们学习 Expression Trees 和 Linq 的复杂性,而是在编码时提供更好的体验 - 即当您开始在括号中键入 lambda 表达式时 Intellisense将向您显示给定实体的所有属性,这很有帮助。此外 lambda 表达式是强类型的,因此如果您输入错误的属性,您的程序将无法编译。考虑在 Property() 方法中将属性名称作为字符串 - 编码会变得很麻烦 - 首先您不会从智能感知中获得帮助,因此您必须始终记住(或检查)给定实体具有哪些属性。其次,如果您输入错误的名称,则会在运行时抛出异常,而不是在编译时找不到属性。看看格特阿诺德的评论。我相信这是您问题的解决方案并回答您的问题。

于 2012-09-12T17:19:11.080 回答