存储库删除方法无法正常工作 - 找不到对象

时间:2017-11-12 17:35:05

标签: c#

  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

我试图创建一个工作存储库来添加/删除我的数据库表中的项目。我面临的问题是add方法工作正常但删除方法没有。如图所示的remove方法的问题是该对象不存在。 我尝试了不同的东西,例如将我的删除方法更改为DeleteObject和Attach,但似乎没有任何工作。 有任何想法吗? ADO - &gt;代码优先 - &gt; EF - &gt;回购课

3 个答案:

答案 0 :(得分: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();
    }
}

更新

here所述,DbSet.Remove

  

将给定实体标记为已删除,以便将其删除   调用SaveChanges时的数据库。 请注意,实体必须   在调用此方法之前,存在于上下文中的某些其他状态。

在您的情况下,该项目不在您的上下文中,这就是您看到以下错误的原因:

  

无法删除对象,因为在ObjectStateManager

中找不到该对象

如果该项目在上下文中,正如Rainman在下面的评论中指出的那样,我们不必为数据库进行额外的往返以获取该项目。

答案 1 :(得分: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();
        }

答案 2 :(得分:0)

如果你想让它工作,一旦插入了对象,就从数据库中检索它并在RemoveHardware方法中传递它。

当您传递没有主键的对象时,您将收到该错误。