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 =&gt;转换(Movie.GetProperty(值(MovieTotal +&lt;&gt; c__DisplayClass0).properName)。GetValue(k,null))'不是有效的属性表达式。它必须是'e =&gt;的形式e.Property [.Property]”。
答案 0 :(得分:0)
传递给Property方法的表达式验证它是一个MemberExpression,其.Member属性是PropertyInfo。如果不是您所看到的异常将被抛出。您可以在此处找到执行此操作的实际代码:http://entityframework.codeplex.com/SourceControl/changeset/view/7fb31c1526d0#src%2fEntityFramework%2fUtilities%2fExpressionExtensions.cs(查找GetSimplePropertyAccess方法) 现在,Property()方法采用Expression的原因并不是让人们学习表达树和Linq的复杂性,而是为了在编码时提供更好的体验 - 即当您开始在括号中键入lambda表达式时,Intellisense将向您显示所有属性对给定的实体有帮助。另外lambda表达式是强类型的,所以如果你错误输入了你的程序将无法编译的属性。考虑在Property()方法中将属性名称作为字符串 - 编码会变得很麻烦 - 首先,您不会从智能感知中获得帮助,因此您必须始终记住(或检查)给定实体具有的属性。其次,如果您输入错误的名称,则在找不到该属性而不是在编译时将在运行时抛出异常。 看看Gert Arnold的评论。我相信这是您的问题的解决方案,并回答您的问题。