ASP.NET 5 MVC 6汎用リポジトリパターン

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

質問

チュートリアルや何かを探していた。

私はMVC5用の古い汎用リポジトリパターンを新しいMVC6プロジェクトに実装しようとしていました。

私は3つのクラスライブラリの.Core.Data.Serviceを設定し.Core.Data問題がありIDBset 。私のIDBsetはそれが気に入らないようですが、 System.DataとEntityフレームワーク6を追加しようとしましたが、 ...紛らわしい)。

Googleをローミングした後、私はここで尋ねることに決めました。正しい方法でチュートリアルがありますか、誰かが非常に単純なMVC6 Generic Repositoryパターンを投げてしまえますか?私はそれを行う古いメソッドが変更されている可能性がある気分を持っている、ちょうど傾きは、inbuilt DI以外の情報を見つけるようです。

コード:私のIDbContextインターフェイス

IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity;

IDbSetが表示されません。これは単にEntity Frameworkのためですか?私はそれに言及している。

問題は、私はエンティティフレームワークのための使用法を見つけることができない場合があります。

更新:

エンティティフレームワーク8.0.0ベータ版の使用。すべてのIDbset参照をDbSetに変更します。

しかし私のジェネリックリポジトリでは、次のようなメソッドを使用します。

public virtual T GetById(object id)
{
    return this.Entities.Find(id);
}

"Find"はメソッドではありません。私はもはや私のキャッチで "DbEntityValidationException"を使用することはできません。

受け入れられた回答

Entity Framework 7 Beta 8にはFindメソッドが付属していません。おそらく最終リリース前に追加されます。

代わりにFirstOrDefaultメソッドを使用する必要があります

public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

Idプロパティは認識されないので、インターフェースを追加してリポジトリに実装する必要があります。

public interface IEntity
{
     int Id { get; set; }
}

例えば

 public class GenericRepository<T> : IGenericRepository<T> where T: class, IEntity

github issueリストから 。 EF7は自動データ検証を実行しないため、DbEntityValidationExceptionはEF7に存在しません。

メモ:EF7はEFの更新ではなく、書き直しです。


人気のある回答

firsteの答えとは逆に、私はFirstOrDefaultを使用して自信を持っていません。なぜなら、SELECT TOP 1 [...]を生成するからです。

多くの場合、IDは一意である必要がありますが、時には悪いデザインのDbを持つことがあります。そうでない場合、アプリケーションは例外をスローする必要があります(これは私たちが見ているものです)。

だから、EF7がFind()メソッドを実装するまで、私はSingleOrDefault()を使うことを強く勧めます:

public virtual T GetById(int id)
{
    return this.Entities.SingleOrDefault(x => x.Id == id);
}

同様に、アプリケーションコントロールを追加して、Idが一意であることを確認します.Dbが正しく行われているかどうかに関わらず、気にしないでください。それはあなたのビジネスに別のレベルのセキュリティを追加します。



Related

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