0

以下に示すようなモデルがあります(モデルファーストアプローチを使用して作成)。

本は売り物です。DigitalDiscは売り物です。これは正常に機能しており、データがデータベースに正しく挿入されています。

「購入」という名前の新しいエンティティを追加しています。1 回の購入には複数の販売アイテムが含まれます。この新しい関連付けを追加してデータベース スキーマを更新すると、次の例外が発生します。

エントリの更新中にエラーが発生しました。

"INSERT ステートメントは、FOREIGN KEY 制約 \"FK_PurchaseSellingItem\" と競合しました。データベース \"LibraryReservationSystem\"、テーブル \"dbo.Purchases\"、列 'PurchaseId' で競合が発生しました。\r\nステートメントは終了しました。 "}

これを克服する方法は?

注:本を作成する必要があります(本のデータをデータベースに入力するなど)。この書籍の購入が発生する場合と発生しない場合があります。ブックが作成されるとき、そのブックの外部キー列は null である必要があります。しかし、その列が更新されると、それは Purchase テーブルに存在する ID である必要があります。それは可能ですか?

ここに画像の説明を入力

注: モデルで「PurchasePurchaseId」フィールドを null 可能にしようとすると、次のエラーが発生します。

エラー 1 エラー 113: 関係 'PurchaseSellingItem' のロール 'Purchase' では多重度が無効です。従属ロールのすべてのプロパティは null 可能であるため、プリンシパル ロールの多重度は '0..1' である必要があります。C:\Documents and Settings\U16990\My Documents\Visual Studio 2010\Projects\LijosEF\LijosEF\MyModelFirstTest.edmx 35 3 LijosEF

コード

class Program
{

    static string connectionStringVal;

    static void Main(string[] args)
    {

        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
        sqlBuilder.DataSource = ".";
        sqlBuilder.InitialCatalog = "LibraryReservationSystem";
        sqlBuilder.IntegratedSecurity = true;

        // Initialize the EntityConnectionStringBuilder.
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        entityBuilder.Provider = "System.Data.SqlClient";
        entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
        entityBuilder.Metadata = @"res://*/MyModelFirstTest.csdl|res://*/MyModelFirstTest.ssdl|res://*/MyModelFirstTest.msl";

        connectionStringVal = entityBuilder.ToString();


        AddBook();
        AddDisc();





    }

    private static void AddBook()
    {

        //string connectionstring = "Data Source=.;Initial Catalog=SalesDB;Integrated Security=True;Connect Timeout=30";
        using (var db = new MyModelFirstTestContainer(connectionStringVal))
        {
            Book book = new Book();
            book.AvailabilityStatus = "Available";
            book.Price = 150;
            book.Title = "Maths Easy";

            db.SellingItems.AddObject(book);
            db.SaveChanges();

        }

    }

    private static void AddDisc()
    {

        //string connectionstring = "Data Source=.;Initial Catalog=SalesDB;Integrated Security=True;Connect Timeout=30";
        using (var db = new MyModelFirstTestContainer(connectionStringVal))
        {
            DigitalDisc disc = new DigitalDisc();
            disc.AvailabilityStatus = "Available";
            disc.Price = 300;
            disc.Artist = "Turtle Violin";

            db.SellingItems.AddObject(disc);
            db.SaveChanges();

        }

    }

}

参照:

  1. データベース設計 - 記事、ブログ投稿、写真、ストーリー

  2. Entity Framework (モデル優先) で複合キーを生成できますか?

4

1 に答える 1

1

関係を必須に設定しましたが、SellingItem関連なしで保存していますPurchasePurchaseレコードをデータベースに保存する前にEFが何らかの例外をスローすると予想しますが、そうではなく、おそらくFK列のデフォルト値を渡そうとしますが、そのようなものはありませんId

ところで。販売アイテムは複数回販売でき、購入は複数の販売アイテムを持つことができるため、代わりに多対多の関係を使用するべきではありませんか?

于 2012-07-27T11:38:43.210 に答える