2016-03-03 101 views
0

我遇到了从数据库中的对象中的列表中删除对象的问题。从列表数据库中删除对象实体

这里是我的类:

public class Client 
{ 
    public int Id {get; set;} 
    private List<Project> projects; 
    public virtual List<Projet> Projects 
    { 
     get { return projects; } 
     set 
     { 
      if (value != null) 
       projects = value; 
     } 
    } 
} 

这里是上下文:

public class MyDbContext : DbContext 
{ 
    public DbSet<Client> Clients {get; set;} 
    public DbSet<Projet> Projects {get; set;} 
} 

但是当我DAL,我尝试这样做:

public void ClientDeleteProject(Client c, Project p) 
{ 
    c.Projects.Remove(p); 
    db.SaveChanges(); 
} 

好了,列表中仍然包含项目p。我甚至试图做一个RemoveAll(pr => pr.Id == p.Id),我也试图用db.Projects.Remove(p)直接删除数据库中的项目,但仍然没有任何反应。 我也尝试通过做一个新的列表()通过没有任何反应也清空列表...

我错过了什么?无论我使用的是对象还是其ID,“项目”列表af客户端不会更改...

谢谢您的帮助!

编辑:

下面是一些更具体的代码:

public class Client 
{ 
    [Key] 
    public int Id { get; set; } 
    private string name; 
    private string address; 
    private string image; 
    private List<Contact> contactsClient; 
    private List<Project> projectsClient; 
    //properties are defined after that, with the keyword "virtual" for the lists 
} 

其实我的问题是另一个类,但是它比较容易的方式呈现与“项目”,这里是有问题的类:

public class Contact : Person 
{ 
    private Client associatedClient; 
    private List<Projet> i; 
    private List<Projet> ir; 
    //same for the properties 
} 

人只是一个具有多个字符串的类,例如名字,姓氏......以及相关的属性。

我试过这个,但它不起作用。该联系人仍在数据库中...

Contact c = db.Projects.FirstOrDefault(co => co.Id == id); 
if(c != null) { 
    db.Contacts.Remove(c); 
    db.SaveChanges(); 
} 

我希望有所帮助。

难道它来自我的课程不是POCO的事实吗?

+0

后你为什么试图删除内存中的东西(从你的列表中),然后调用db上的SaveChanges?这是没有意义的......如果你想从Db中删除它,你应该使用你的DbSet项目来删除它。否则,这在您的DAL中没有任何作用。您是否设置了断点来查看您的列表是否已填充? – cdie

+0

请做正确的事情,使用同一类型的项目的变量,我的意思是“不使用联系人c”,但“项目p = db.Project ...”。在执行删除后使用返回的变量。你知道那个实体框架将使用你的对象来理解哪些表引用了删除吗? –

+0

对不起,我犯了一个错误:我的意思是'db.Contacts.Remove'在最后一个片段。 – Raphallal

回答

1

你做错了。 要删除数据,您必须使用DbContext对象,这是数据和数据库之间的真实连接器。

正确的方法是这样的:

var project = db.Projects.FirstOrDefault(p => p.Id == id); 
if(project != null) { 
    db.Projects.Remove(project); 
    db.SaveChanges(); 
} 

另一目的是不相关的东西。我使用“FirstOrdefault”与Id匹配,因为我不知道您的对象(项目)是否附加到上下文。

+0

DbSet中没有“RemoveAll”方法,我错了吗? – Raphallal

+0

Ops,我犯了一个错误。请检查我编辑的答案:) –

+0

如果FirstOrDefault返回null,可能会引发异常 – cdie

0

您并未从数据库中删除任何内容。

你应该从上下文中删除,以坚持更改 假设你传递的p是一个有效的实例从数据库检索与EF

db.Projects.Remove(p); 
db.SaveChanges(); 

如果没有,你就必须做到这一点

var project = db.Project.SingleOrDefault(m => m.Id == p.Id); 
if(project != null) { 
    db.Projects.Remove(project); 
    db.SaveChanges(); 
} 
0

先找出对象通过其ID,然后删除该对象

if(db.Projects.Find(id) != null) { 
    db.Projects.Remove(project); 
    db.SaveChanges(); 
}