2017-11-12 14 views
0
public class Hardware 
{ 
    public int id { get; set; } 
    public int Nodes { get; set; } 
    public int Repeaters { get; set; } 
    public int Hubs { get; set; } 

} 

public abstract class Repositories<T> where T:class 
{ 
    //where T:class fixes the issue with .SET 


    //Repository class constructor once initialized will instantiate datamodel 
    //Manufacturing data model instantiate because it models table 

    ManufacturingDataModel MDM; 
    public Repositories(ManufacturingDataModel mdm) 
    { 
     MDM = mdm; 
    } 

    public List<T> GetHardware() 
    { 
     //Creating new list and adding data from db in it 

     List<T> data = new List<T>(); 
     foreach(var i in MDM.Set<T>()) 
     { 
      data.Add(i); 
     } 
     return data; 
    } 

    public void AddHardware(T item) 
    { 
     MDM.Set<T>().Add(item); 
     MDM.SaveChanges(); 

    } 


    public void RemoveHardware(T item) 
    { 
     MDM.Set<T>().Remove(item); 
     MDM.SaveChanges(); 
    } 

    public void UpdateHardware(T item) 
    { 
     MDM.Set<T>().AddOrUpdate(item); 
     MDM.SaveChanges(); 
    } 



public class Test : Repositories<Hardware> 
{ 
    public Test(ManufacturingDataModel mdm) : base(mdm) 
    { 
    } 



static void Main(string[] args) 
    { 
     ManufacturingDataModel MDM = new ManufacturingDataModel(); 
     Test t = new Test(MDM); 

     Hardware hardware = new Hardware(); 

     hardware.Nodes = 55; 
     hardware.Repeaters = 46; 
     hardware.Hubs = 82; 



     t.AddHardware(hardware); // WORKS 

     t.RemoveHardware(hardware); //DOES NOT WORK 

enter image description hereリポジトリ削除は - オブジェクト私は私のdbテーブルから項目を削除/追加する作業リポジトリを作成しようとしている

が見つかりません。私が直面している問題は、addメソッドは完全に機能しますが、removeは機能しないということです。画像に示されているremoveメソッドの問題は、オブジェクトが存在しないことです。 私はDeleteObjectとAttachに私のremoveメソッドを変更するなど、何かを試しましたが、何も動作していないようです。 アイデア ADO - >コード最初 - > EF - >レポクラス

答えて

0

あなたが削除して、それを削除したい項目フェッチする最初の持っている:

public void RemoveHardware(T item) 
{ 
    var dbItem = MDM.Set<T>().FirstOrDefault(x=>x.Id == item.Id); 
    if(dbItem!=null) 
    { 
     MDM.Set<T>().Remove(dbItem); 
     MDM.SaveChanges(); 
    } 
} 

を更新

それはあなたのケースではhereDbSet.Remove

Marks the given entity as Deleted such that it will be deleted from the database when SaveChanges is called. Note that the entity must exist in the context in some other state before this method is called.

を記載されているとおりのアイテムは、あなたのコンテキストではありません

The object cannot be deleted because it was not found in the ObjectStateManager

項目が文脈にあった場合、そのよう正しくレインマンは以下の彼のコメントで指摘している、我々はデータベースへの余分処理を行う必要がありwoulnd't:Dこれはあなたが次のエラーを参照してください理由でありますアイテムを取得します。

+1

お客様のシナリオでは、「item.Id」情報がある場合、エンティティに再度照会する必要はありません。データベースに2回ヒットします。 – lucky

+0

ここではhttps://msdn.microsoft.com/en-us/library/system.data.entity.dbset.remove(v=vs.113).aspxを読むことができます。 'Remove' *指定されたエンティティをマークしますSaveChangesが呼び出されたときにデータベースから削除されるように、Deletedとして削除します。 **このメソッドが呼び出される前に、エンティティがコンテキスト内に存在していなければなりません。*通常、誰かがアイテムの削除を要求すると、これはコンテキスト内ではありません。これが私がそう言った理由で、OPがこのエラーを見る理由です。 – Christos

+1

はい、あなたは正しいです。エンティティを削除しようとする前に、コンテキスト内に存在するようにエンティティをアタッチする必要があります。私は自分の答えを更新しました。 – lucky

0

あなたはハードウェアエンティティのユニークなID(主に主キー)を設定する必要があります。 それはそういうものです。

 Hardware hardware = new Hardware(); 

     hardware.Id = 1 //Set your unique Id here 
     hardware.Nodes = 55; //Not necessary 
     hardware.Repeaters = 46; //Not necessary 
     hardware.Hubs = 82; //Not necessary 
     RemoveHardware(hardware); 

     // So edit your RemoveHardware method too like this 
     public void RemoveHardware(T item) 
     { 
      MDM.Set<T>().Attach(item); 
      MDM.Set<T>().Remove(item); 
      MDM.SaveChanges(); 
     } 
0

オブジェクトを挿入したら、データベースから取得してRemoveHardwareメソッドで渡します。

プライマリキーなしでオブジェクトを渡すと、そのエラーが発生しています。

関連する問題