この問題は、stackoverflowで何度も議論されていますが、ジェネリックリポジトリパターンを使用してどのように解決されたかについての回答は見つかりませんでした。 すべての答えはDBContextを直接使用しています。ジェネリックリポジトリパターンでは、DBContextに直接アクセスすることはできません。また、Unity for IOCを使用しています。Entity Framework:汎用リポジトリパターンを使用して子を削除するにはどうすればよいですか?
ここに問題があります:私は親と親に子コレクションがあります。私は親にいくつかのプロパティを設定しており、コレクションから子を削除しています。外部キープロパティの 一つ以上が非NULL可能であるため、関係を変更することができませんでした:私はSaveChanges()
を呼び出すときしかし、私はエラー
が取得操作に失敗しました。リレーションシップに が変更された場合、関連する外部キープロパティはNULL値に設定された です。外部キーがNULL値をサポートしていない場合は、 新しい関係を定義する必要があります。外部キーのプロパティは に別のNULL以外の値を割り当てる必要があります。または、関連しないオブジェクトは を削除する必要があります。
これで、EFがレコードを削除するのではなく、FKをnullに設定しようとしている理由がわかりません。 FKをヌルに設定し、DBに孤立レコードを保持するようにしましょう。
どのように私はこの問題をリポジトリパターンを使って解決しますか?リポジトリから新しいメソッドを公開する必要がありますか?
エンティティ
public class parent
{
public int ParentID {get;set;} //Primary Key
public string ParentName {get;set}
public ICollection<Child> Children {get;set}
}
public class Child
{
public int ChildID {get;set;} //Primary Key
public string ChildName {get;set;}
public int ParentID {get;set;} //Foreign Key
}
サービス
public class MyService
{
private IGenericRepository _repository;
public MyService(IGenericRepository repository)
{
_repository = repository;
}
public void UpdateParent(int parentID,string parentName, int[] sourceChildIDs)
{
var p = _repository.GetQuery<Parent>()
.Include(x => x.Children)
.Where(x => x.ParentID == parentID)
.SingleOrDefault();
p.ParentName = parentName;
var childrenToDetete = new List<Child>();
foreach (var child in p.Children)
{
if (!sourceChildIDs.Contains(child.ChildID))
{
childrenToDetete.Add(child);
}
}
foreach (var child in childrenToDetete)
{
p.Children.Remove(child);
}
_repository.SaveChanges(); // i get error here
}
}
あなたは番目の子供を削除しているリポジトリ
public class GenericRepository : IGenericRepository
{
private DbContext _dbContext;
public GenericRepository(DbContext dbContext)
{
if (dbContext == null)
{
throw new ArgumentNullException("dbContext");
}
_dbContext = dbContext;
}
public TEntity Create<TEntity>() where TEntity : class
{
return _dbContext.Set<TEntity>().Create<TEntity>();
}
public TEntity Add<TEntity>(TEntity entity) where TEntity : class
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
return _dbContext.Set<TEntity>().Add(entity);
}
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
return _dbContext.Set<TEntity>();
}
public IQueryable<TEntity> GetQuery<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
return GetQuery<TEntity>().Where(predicate);
}
public void Delete<TEntity>(TEntity entity) where TEntity : class
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
_dbContext.Set<TEntity>().Remove(entity);
}
public void Delete<TEntity>(Expression<Func<TEntity, bool>> criteria) where TEntity : class
{
IEnumerable<TEntity> records = GetQuery<TEntity>(criteria);
foreach (TEntity record in records)
{
Delete<TEntity>(record);
}
}
public void Update<TEntity>(TEntity entity) where TEntity : class
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
_dbContext.Entry(entity).State = EntityState.Modified;
}
public int SaveChanges()
{
return _dbContext.SaveChanges();
}
}
私はまだdelid – LP13
を計算する必要が推測一行を忘れ、私はどのようにあなたがMyService' 'に' 'GenericRepositoryを注入しようとしている、種類ごとに' GenericRepository を '実装する場合。) –
感謝を。このサービスにはいくつかのメソッドがあり、どのエンティティにもクエリーできる必要があります。 – LP13