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
我试图创建一个工作存储库来添加/删除我的数据库表中的项目。我面临的问题是add方法工作正常但删除方法没有。如图所示的remove方法的问题是该对象不存在。 我尝试了不同的东西,例如将我的删除方法更改为DeleteObject和Attach,但似乎没有任何工作。 有任何想法吗? ADO - &gt;代码优先 - &gt; EF - &gt;回购课
答案 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方法中传递它。
当您传递没有主键的对象时,您将收到该错误。