我只是有一个非常简单的情况,我需要的是使用Linq2Entities删除记录。我试图做一些研究,仍然无法找到正确的方法。
这是我的简单代码:
[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
where y.EmployeeId == z.EmployeeId
select y).FirstOrDefault();
ctx.DeleteObject(x);
ctx.SaveChanges();
}
}
[DataObjectMethod(DataObjectMethodType.Select)]
public List<Employee> GetAllEmployee()
{
using (var ctx = new MyEntity())
{
var x = from y in ctx.Employees
select y;
return x.ToList();
}
}
我可以删除特定记录,例如我将 y.EmployeeName ==“Harold Javier”分配给上面的Delete方法,但是当我指定 y.EmployeeId == z时。 EmployeeId 到上面的代码,删除不起作用。 (注意:EmployeeId是Employee表的主键)
答案 0 :(得分:12)
我认为这是删除
的更好选择using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
orderby y.EmployeeId descending
select y).FirstOrDefault();
ctx.Employees.Remove(x);
ctx.SaveChanges();
}
在我身边DeleteObject
无效,所以我使用Remove
答案 1 :(得分:5)
首先需要在实际删除记录之前验证是否存在记录;
[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
where y.EmployeeId == z.EmployeeId
select y).FirstOrDefault();
if(x!=null)
{
ctx.Employees.DeleteObject(x);
ctx.SaveChanges();
}
}
}
在删除某些内容之前,请务必检查空值。因为用户可能会更改Id(在查询字符串处)并尝试不同的组合。
答案 2 :(得分:4)
我决定回答我自己的问题。
当我执行以下操作时,我的删除功能正常工作:
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
orderby y.EmployeeId descending
select y).FirstOrDefault();
ctx.Employees.DeleteObject(x);
ctx.SaveChanges();
}
我知道可能有比这更好的方法,但它适用于我平均时间。
答案 3 :(得分:4)
上述答案可能已过时......当前版本的ENtity Framework中似乎不存在DeleteObject方法。我不得不使用Remove方法。
var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
答案 4 :(得分:2)
首先,您的原始代码是根据传入的参数选择要删除的记录。您的解决方案是删除具有最大EmployeeId的记录。这可能是你想要的,但不太可能。 第二个问题是完成删除需要两次数据库访问。第一个是让实体删除第二个以实际执行删除。
以下代码段将消除对读取的需要,并将删除员工&#34; z&#34;。这应该会产生预期的结果并且表现更好。
public void DeleteEmployeeId(Employee z)
{
using (var ctx = new MyEntityContext())
{
var x = new Employee{ EmployeeId = z.EmployeeId };
ctx.Entry(x).State = EntityState.Deleted;
ctx.SaveChanges();
}
}
答案 5 :(得分:1)
这可能是因为每个请求的上下文不同(var ctx = new MyEntity())。尝试使用此
public static class ObjectContextPerHttpRequest
{
public static TestCasesModelContainer Context
{
get
{
string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest");
if (!HttpContext.Current.Items.Contains(objectContextKey))
{
HttpContext.Current.Items.Add(objectContextKey, new TestCasesModelContainer());
}
return HttpContext.Current.Items[objectContextKey] as TestCasesModelContainer;
}
}
}
删除就像
public static void Delete(Testcase tc)
{
var db = ObjectContextPerHttpRequest.Context;
db.DeleteObject((from p in db.TestcaseSet
where p.Id == tc.Id
select p).Single());
db.SaveChanges();
}
答案 6 :(得分:1)
以下对我有用:
MyList.RemoveAll(x => x.MyField == 0);