我想更改映射时出错

时间:2012-09-12 02:09:56

标签: .net linq entity-framework express code-first

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]”。

1 个答案:

答案 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的评论。我相信这是您的问题的解决方案,并回答您的问题。