2016-11-10 23 views
0

私は以下のモデルとテーブルでのOData V4、EF6およびMySQL 5.6/5.7 を使用しています。このアプリケーションでは、odata/Applicationsという名前のアプリケーションリソースの結果は正常ですが、odata/Applications?$ expand = rolesのように、ロールを展開するとこのエラーが発生します。EFのODataのMySQL不明な列 'Project3.x' 'where句'

エラー:コマンド定義を実行中にエラーが発生しました。詳細については、内部例外を参照してください。不明な列「Project3.ApplicationId」「where句」

私はそれをマッピングして何かを知っているが、私は何を参照することはできません。

public class Role 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public int ApplicationId { get; set; } 

    //public virtual Application Application { get; set; } 

} 

public class Application 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public bool IsDeleted { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 

    public Application() 
    { 
     Roles = new List<Role>(); 
    } 
} 

public class ApplicationView 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public ICollection<RoleView> Roles { get; set; } 

    public ApplicationView() 
    { 
     Roles = new List<RoleView>(); 
    } 
} 

public class RoleView 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public int ApplicationId { get; set; } 

} 

create table IF NOT EXISTS Application (
ApplicationId int not null auto_increment primary key, 
Name varchar(255) not null, 
IsDeleted bool not null default false, 

CreatedBy varchar(255) not null, 
CreatedOn Datetime not null, 
UpdatedBy varchar(255) not null, 
UpdatedOn DateTime not null 

)ENGINE = INNODB;

create table IF NOT EXISTS Role (
RoleId int not null auto_increment primary key, 
Name varchar(255) not null, 
ApplicationId int not null, 

CreatedBy varchar(255) not null, 
CreatedOn Datetime not null, 
UpdatedBy varchar(255) not null, 
UpdatedOn DateTime not null, 

index app_index (ApplicationId), 
foreign key (ApplicationId) references Application(ApplicationId) on delete cascade 

)ENGINE = INNODB;

これはODataアクションメソッドです。

[HttpGet] 
    [ODataRoute("Applications")] 
    public IQueryable<ApplicationView> Get() 
    { 
     var result = IdentityRepository.Applications 
      .Include("Role") 
      .ProjectTo<ApplicationView>(); 
     return result; 
    } 

マッピングクラス:

public class RoleMap : EntityTypeConfiguration<Role> 
{ 
    public RoleMap() 
    { 
     ToTable("Role"); 

     HasKey(x => x.Id); 
     Property(x => x.Id).HasColumnName("RoleId"); 

     // Tried with/without, no change. 
     //HasRequired(x => x.Application).WithMany(x => x.Roles).HasForeignKey(x => x.ApplicationId); 
    } 
} 

public class ApplicationMap : EntityTypeConfiguration<Application> 
{ 
    public ApplicationMap() 
    { 
     ToTable("Application"); 

     HasKey(x => x.Id); 
     Property(x => x.Id).HasColumnName("ApplicationId"); 

     // Tried with/without no change. 
     HasMany(x => x.Roles).WithRequired().HasForeignKey(x => x.ApplicationId); 
    } 
} 

私は、最初のコードとデータベースの最初のEDMXの両方で、リポジトリを試してみましたが、同じエラーを取得しておきます。

+0

は、 '.INCLUDE( "役割")' '.INCLUDE( "役割")'ではないでしょうか? –

+0

私は、複数形であるかどうかにかかわらず、同じ正確なエラーを試みました。すなわち、Include( "Roles") – Ninos

答えて

0

EFマッピングが正しいようです。私の推測では、問題はProjectToメソッドから来ているということです。これはAutoMapper Queryable Extensionsの一部であるようです。 The documentationは(約ProjectTo)言う:

Note that for this feature to work, all type conversions must be explicitly handled in your Mapping. For example, you can not rely on the ToString() override of the Item class to inform entity framework to only select from the Name column, and any data type changes, such as Double to Decimal must be explicitly handled as well.

は、エラーがそこから来るかどうかを確認、またはおAutoMapperマッピングを確認するために、それを削除Select、またはプレーンにより、クエリProjectToに交換してみてください。

+0

私はオートマッパーを考えましたが、私はここで私のマッピングを追加するのを忘れてしまったことを謝ります。私はさえProjectTo <>を処分したとばかりオブジェクトモデル、すなわち リターンIdentityRepository.Applications.Include(「ロール」)が返さ。 Mapper.Initialize(X => { x.CreateMap <マーケット、MarketView>(); x.CreateMap <アプリケーション、アプリケーションビュー>() .ForMember(DEST => dest.Roles、OPT => OPT。 MapFrom(SRC => src.Roles)); x.CreateMap <ロール、RoleView>(); x.CreateMap ();} )。 – Ninos

+0

こんにちは、私はまだこの問題を考え出していません。私は本当に誰かが光を放つことを願っています。 – Ninos

+0

あなたのモデルがデータベースと同期していることを確認してください。実際のデータベーススキーマとEFで生成されたクエリが一致しないようです。あなたが 'Add-Migration Test'をしたら、あなたはUp/Downメソッドで何かを得ますか?あなたがそうした場合、あなたのdbは最新ではありません。また、クエリによって生成された実際のSQLを見て、データベースに対して手動で実行してみてください。その他のアイデア:正しいデータベースに接続していますか?そしてその 'Project3'プレフィックスは、データベースの名前ですか、テーブル名プレフィックスとして意味がありますか?コードのどこにでも表示されますか? – Diana

関連する問題