2011-08-02 23 views
0

は、私はこの問題は、私は子オブジェクトをこのようおよびEFを削除しようとするということであるasp.net MVCアプリケーションでのこの単純な削除] GETとPOSTメソッドEF外部キー制約とリポジトリパターン

public ActionResult Delete(int ehrId, int id) 
     { 
      EHR ehr = ehrRepository.FindById(ehrId); 
      PhysicalTest test = ehr.PhysicalTests.Where(t => t.ID == id).Single(); 
      return View(test); 
     } 


     [HttpPost, ActionName("Delete")] 
     public ActionResult DeleteConfirmed(int ehrId, int id) 
     { 
      EHR ehr = ehrRepository.FindById(ehrId); 
      PhysicalTest test = ehr.PhysicalTests.Where(t => t.ID == id).Single(); 
      ehr.PhysicalTests.Remove(test); 
      unitOfWork.Commit(); 
      TempData["Success"] = "You have deleted the Physical Test Succesfully"; 
      return RedirectToAction("Index"); 
     } 

を持っています

操作が失敗しました: 1つ以上の外部キーのプロパティがnullにできないため、関係を変更できませんでした。リレーションシップに が変更された場合、関連する外部キープロパティはNULL値に設定された です。外部キーがNULL値をサポートしていない場合は、 新しい関係を定義する必要があります。外部キーのプロパティは に別のNULL以外の値を割り当てる必要があります。または、関連しないオブジェクトは を削除する必要があります。

一つの答えはPhysicalTest(子要素)の代わりにEHRRepositoryのリポジトリを使用することです..しかし、それdoesntのは、私は常にユーザーを避けるために、親オブジェクトを介して照会のセキュリティを強化したい、良い解決策の原因のように見えます彼に属していないphysicalTestの編集/削除から。

私はちょうど根を集約するために私のリポジトリを制限するのが大好きです。

Heres私の現在のSqlRepository一般的な実装....私は提案を開く。 PhyscialTestがEHRなしでは存在できないため、EHRは(あなたの例外がFKをPhysicalTestにはnullにすることはできませんと言う)PhysicalTestの集計ルートです

public class SqlRepository<T> : IRepository<T> 
            where T : class, IEntity { 

     internal SummumnetDB context; 
     internal DbSet<T> _objectSet; 

     public SqlRepository(SummumnetDB context) 
     { 
      this.context = context; 
      this._objectSet = context.Set<T>(); 
     } 


     public IQueryable<T> Find(Expression<Func<T, bool>> predicate) { 
      return _objectSet.Where(predicate); 
     } 

     public void Add(T newEntity) { 
      _objectSet.Add(newEntity); 
     } 

     public void Remove(T entity) { 
      _objectSet.Remove(entity); 
     } 

     public IQueryable<T> FindAll() 
     { 
      return _objectSet; 
     } 

     public T FindById(int id) 
     { 
      return _objectSet.Single(o => o.ID == id); 
     } 


    } 

答えて

0

あなたEHRPhysicalTestフォームが集計します。リポジトリは集約ルートごとに存在する必要があり、リレーションを処理する特定の方法を提供する必要があります。

はい構成や要件の異なるエンティティの一般的なアプローチが機能しないため、一般的ではありません。

コードにはどのような問題がありますか? ehr.PhysicalTests.Remove(test)を呼び出すと、テストは削除されません。 FKはnullに設定されます。 testも削除するには、実際にcontext.DeleteObject(test)を呼び出す必要があります。直接削除を許可するには、identifying relationを使用する必要があります。