EFコア多種多様な設定がFluent APIで動作しない

asp.net c# entity-framework entity-framework-core

質問

私は、FLuent APIとEF Coreを使用して多数の反駁を理解し実装することに問題があります。

私はこの質問を見て、私の関係を正確に設定しましたが、私は次のエラーが発生しています:

エラーCS1061 'CollectionNavigationBuilder'に 'WithMany'の定義が含まれておらず、 'CollectionNavigationBuilder'タイプの最初の引数を受け入れる拡張メソッド 'WithMany'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?

これが私の意図です。私には多くの仕事を持つクライアントがいます。私はそのクライアントにリンクされたすべての仕事を得ることができるはずです。 EFはバックグラウンドで結合テーブルを作成する必要があります...

ここに私のクラスがあります:

public class Client : IEntityBase
{
    public int Id { get; set; }

    public int? JobId { get; set; }
    public ICollection<Job> Jobs { get; set; }
}

public class Job : IEntityBase
{
    public int Id { get; set; }
}

//my interface
public interface IEntityBase
{
    int Id { get; set; }
}

編集私が試したFluent APIは、ここでは ".withMany"

        modelBuilder.Entity<Client>()
            .HasMany(p => p.Jobs)
            .WithMany(p => p.clients)
            .Map(m =>
            {
                m.MapLeftKey("ClientId");
                m.MapRightKey("JobId");
                m.ToTable("ClientJob");
            });

私はChris Sakellのブログで一般的なリポジトリパターンを使用しています。クライアントを取得するコードは次のとおりです。

        IEnumerable<Client> _clients = _clientRepository
           .AllIncluding(s => s.Creator, s => s.Jobs, s => s.State)
           .OrderBy(s => s.Id)
           .Skip((currentPage - 1) * currentPageSize)
           .Take(currentPageSize)
           .ToList();

私は次のようにジェネリックコードを使用しています:

    public virtual IEnumerable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
    {
        IQueryable<T> query = _context.Set<T>();
        foreach (var includeProperty in includeProperties)
        {
            query = query.Include(includeProperty);
        }
        return query.AsEnumerable();
    }

上記のAllincludingステートメントに従ってインクルードプロパティを使用してジョブを取得できるように、これを設定するにはどうすればよいですか?

人気のある回答

実装しようとしているFluent APIの例はEF 6から来ています。EF Coreでは、多対多のリレーション構成は少し異なります。まず始めに、結合/ブリッジングテーブルを表すエンティティを含める必要があります。

public class ClientsJobs
{
    public int ClientId { get; set; }
    public int JobId { get; set; }
    public Client Client { get; set; }
    public Job Job { get; set; }
}

次に、OnModelCreatingメソッドでこのように設定します。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ClientsJobs>()
        .HasKey(x => new { x.ClientId, x.JobId });

    modelBuilder.Entity<ClientsJobs>()
        .HasOne(x => x.Client)
        .WithMany(y => y.Jobs)
        .HasForeignKey(y => y.JobId);

    modelBuilder.Entity<ClientsJobs>()
        .HasOne(x => x.Job)
        .WithMany(y => y.Clients)
        .HasForeignKey(y => y.ClientId);
}

それについての詳細をここに見なさい: http : //www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

注意:あなたが追加する必要があるので、関連クラス関係の両端のためのナビゲーションプロパティを含める必要がない ClientsあなたにプロパティをJob実体。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ