我在从数据库中的对象的列表中删除对象时遇到问题。
这是我的班级:
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吗?
答案 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();
}