19

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();
    }
}

たとえば、上記のDeleteメソッドにy.EmployeeName == "Harold Javier"を割り当てると、特定のレコードを削除できますが、上記のコードにy.EmployeeId == z.EmployeeIdを割り当てると、削除が機能しません。(注:EmployeeIdはEmployeeテーブルの主キーです)

4

7 に答える 7

19

これは削除のより良いオプションだと思います

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

于 2015-12-17T04:18:56.400 に答える
10

実際にレコードを削除する前に、まずレコードが存在するかどうかを確認する必要があります。

[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();
             }
        }
     }

何かを削除する前に、常にnullをチェックしてください。ユーザーが(クエリ文字列で)IDを変更し、さまざまな組み合わせを試す可能性があるためです。

于 2013-03-18T04:32:42.360 に答える
6

上記の答えは古くなっている可能性があります...DeleteObjectメソッドは現在のバージョンのENTityFrameworkには存在しないようです。Removeメソッドを使用する必要がありました。

var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
于 2016-10-26T14:45:37.893 に答える
6

@ハロルド、この投稿はかなり古いことは知っていますが、元の質問と回答に対処することが重要だと思います。あなたの解決策はあなたの状況でうまくいったかもしれませんが、いくつかの問題があります。

まず、元のコードは、渡されたパラメーターに基づいて削除するレコードを選択していました。解決策は、最大のEmployeeIdを持つレコードを削除することです。それはあなたが望むものかもしれませんが、そうではありません。2番目の問題は、削除を実行するために2つのデータベースアクセスが必要なことです。1つ目は、エンティティに削除を取得させ、2つ目は実際に削除を実行することです。

次のコードスニペットは、読み取る必要をなくし、従業員「z」を削除します。これにより、目的の結果が得られ、パフォーマンスが大幅に向上します。

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();  
    }
}
于 2017-04-13T15:11:47.980 に答える
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();
    }

これよりも良いアプローチがあるかもしれないことを私は知っていますが、それは当分の間私のために働きます。

于 2013-03-19T02:50:58.727 に答える
2

以下は私のために働いた:

MyList.RemoveAll(x => x.MyField == 0);
于 2019-01-07T02:57:29.417 に答える
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();
}
于 2013-05-30T12:19:11.290 に答える