从列表数据库实体

时间:2016-03-03 11:35:35

标签: c# database entity-framework list

我在从数据库中的对象的列表中删除对象时遇到问题。

这是我的班级:

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 =&gt; pr.Id == p.Id),我也尝试用db.Projects.Remove(p)直接删除数据库中的项目,但仍然没有任何反应。 我也尝试通过新的List()来清空列表,也没有任何反应......

我错过了什么?无论我是使用对象还是其ID,&#34;项目&#34; list 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
}

实际上我的问题是针对另一个班级但是更容易呈现&#34; Project&#34;,这里是有问题的班级:

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

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

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

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

我希望有所帮助。

这可能来自我的课程不是POCO吗?

3 个答案:

答案 0 :(得分:1)

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

正确的方法是这样的:

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

另一个对象与任何事物无关。我使用&#34; FirstOrdefault&#34;与Id匹配,因为我不知道您的对象(项目)是否附加到上下文。

答案 1 :(得分:0)

您不会从数据库中删除任何内容。

您应该从上下文中删除以保留更改 假设您传递的p是从Db使用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();
 }

答案 2 :(得分:0)

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

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