public abstract class RepositoryBase<T> : IRepository<T> where T : class
{
private ShopCoreDbContext dbContext;
private readonly DbSet<T> dbSet; //here
protected IDbFactory DbFactory { get; private set; }
protected ShopCoreDbContext DbContext
{
get => dbContext ?? (dbContext = DbFactory.Init());
}
protected RepositoryBase(IDbFactory dbFactory)
{
DbFactory = dbFactory;
dbSet = DbContext.Set<T>();
}
public virtual T Add(T entity)
{
return dbSet.Add(entity); //err here
}
}
IDbSetでは何も起こりません。ただし、エンティティコアにはIDbSetインターフェイスは存在しません。これはエラーの詳細です:
タイプMicrosoft.entityframeworkcore.changetracking.entityentryをTに暗黙的に変換することはできません
インターフェイスである必要があります。
それでは、今何をすべきでしょうか?
差し迫った問題を解決するには:
Add
メソッドは、エンティティを直接返すのではなく、ラッパーエンティティを返します。 .Entity
プロパティを使用して値を取得します(または、渡された値を返します)。
public virtual T Add(T entity)
{
return dbSet.Add(entity).Entity;
}
IDbSet<T>
インターフェイスについて:Entity Framework CoreにはIDbSet<T>
インターフェイスがありません。
このGitHubの問題 によれば、DbSet<T>
はテストまたはサブクラス化のためにモックに使用できる抽象基本クラスであるため、元に戻す計画はありません。
インターフェースの問題は、新しいメンバーを除外するか、インターフェースを実装する人々を破壊することです。基本クラスは、実際に使用するメソッドを実装するだけでよいため、(モックフレームワークを使用するよりも)独自のテストダブルを作成する人にとってもわずかに優れています。
[…]
EF6.xのベースタイプアプローチをいくつかのリリースで使用してきましたが、これが機能しない実際のシナリオに関するフィードバックはまだありません。