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 メソッドに渡される式は、.Member プロパティが PropertyInfo である MemberExpression であることが確認されます。表示されている例外でない場合は、スローされます。ここでそれを行う実際のコードを見つけることができます: http://entityframework.codeplex.com/SourceControl/changeset/view/7fb31c1526d0#src%2fEntityFramework%2fUtilities%2fExpressionExtensions.cs(GetSimplePropertyAccess メソッドを探してください) Property() メソッドが Expression を取る理由は、式ツリーと Linq の複雑さを人々に学習させるためではなく、コーディング時のエクスペリエンスを向上させるためです。指定されたエンティティのすべてのプロパティが表示されますが、これは役に立ちます。さらに、ラムダ式は厳密に型指定されているため、プロパティを誤って入力すると、プログラムはコンパイルされません。Property() メソッドでプロパティ名を文字列として使用することを検討してください。コーディングが面倒になります。まず、インテリセンスの助けが得られないため、特定のエンティティが持つプロパティを常に覚えておく (または確認する) 必要があります。次に、名前の入力を間違えると、コンパイル時ではなく、実行時にプロパティが見つからなかったときに例外がスローされます。Gert Arnold のコメントをご覧ください。これがあなたの問題の解決策であり、あなたの質問に対する答えだと思います。

于 2012-09-12T17:19:11.080 に答える