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 方法的表达式将验证它是否是其 .成员属性是属性信息。如果不是,您将看到的异常将被抛出。你可以在这里找到这样做的实际代码:http://entityframework.codeplex.com/SourceControl/changeset/view/7fb31c1526d0#src%2fEntityFramework%2fUtilities%2fExpressionExtensions.cs(查找GetSimplePropertyAccess方法(现在,Property(( 方法采用表达式的原因不是让人们学习表达式树和 Linq 的复杂性,而是在编码时提供更好的体验 - 即当您开始在括号中键入 lambda 表达式时,智能感知将向您显示给定实体上的所有属性,这很有帮助。此外,lambda 表达式是强类型的,因此如果您键入了错误的属性,程序将无法编译。考虑在 Property(( 方法中将属性名称作为字符串 - 编码会变得很麻烦 - 首先,您将无法从智能感知中获得帮助,因此您必须始终记住(或检查(给定实体具有的属性。其次,如果键入了错误的名称,则会在运行时找不到该属性时而不是在编译时引发异常。看看格特·阿诺德的评论。我相信这是您问题的解决方案和问题的答案。