1

以下のモデルとテーブルを使用して、OData V4、EF6、および MySql 5.6/5.7 を使用しています。この呼び出し odata/Applications でアプリケーション リソースの結果は問題ありませんが、odata/Applications?$expand=roles のようにロールを展開するとこのエラーが発生します。

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

マッピングがあることは知っていますが、何がわかりません。

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

) エンジン=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

) エンジン=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 の両方でリポジトリを試しましたが、同じエラーが発生し続けます。

4

1 に答える 1

0

EF マッピングは正しいようです。私の推測では、問題はProjectToメソッドに起因するものです。これは AutoMapper Queryable Extensions の一部のようです。ドキュメントには次のように書かれています(約ProjectTo):

この機能を機能させるには、すべての型変換をマッピングで明示的に処理する必要があることに注意してください。たとえば、Item クラスの ToString() オーバーライドに依存して、エンティティ フレームワークに Name 列からのみ選択するよう通知することはできません。

クエリProjectToをに置き換えるSelectか、単純に削除して、エラーがそこから発生したかどうかを確認するか、AutoMapper マッピングを確認してください。

于 2016-11-11T18:26:28.727 に答える