5

VS 2012 (11.0.60315.01 Update 2)、C# 5、Entity Framework 5.0.0.0 (ランタイム v4.0.30319)

過去に同様の質問が投稿されたことは知っていますが、回答がないようです。私はエラーを理解していると思いますが、「望ましい」解決策を見つけることにもっと興味があります。 私がしたいのは、Child テーブルからレコードを削除することだけです。 誰でも助けることができますか?

これは完全単純な例です。SaveChanges()は次の例外をスローします。

「操作に失敗しました: 1 つ以上の外部キー プロパティが null 値を許容しないため、関係を変更できませんでした。関係が変更されると、関連する外部キー プロパティが null 値に設定されます。外部キーは null 値をサポートしていません。新しい関係を定義する必要があります。外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。」

コードは次のようになります。

using System.Linq;

namespace EFDeleteTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (EFTestEntities context = new EFTestEntities())
            {
                var parent = context.Parents.Single(p => p.Id == 1);

                var child = parent.Children.Single(c => c.Id == 1);

                parent.Children.Remove(child);

                context.SaveChanges(); // Throws the above Exception
            }
        }
    }
}

データベースは次のようになります。

Parent
    Id   (PK, int, not null)   IDENTITY
    Name (nvarchar(50), null)

Child
    Id       (PK, int, not null)  IDENTITY
    ParentId (FK, int, not null)  -- Foreign Key to the Parent Table (Id column))
    Name     (nvarchar(50), null)

親テーブルには 1 つのレコード (Id = 1) があり、子テーブルには 2 つのレコード (Id の 1 と 2) があります。Child レコードは両方とも ParentId = 1 です。

4

1 に答える 1

8

子オブジェクトを削除することだけが必要な場合、親オブジェクトはロジックに関係しません。以下のコードを試して、何が起こるか教えてください (テストされていません)。

using System.Linq;

namespace EFDeleteTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (EFTestEntities context = new EFTestEntities())
            {                      
                var child = context.Children.Single(c => c.Id == 1);

                context.Children.Remove(child);

                context.SaveChanges();
            }
        }
    }
}
于 2013-06-12T04:27:25.640 に答える