0

1-1でリンクされているVideoクラスとMediaContentクラスがあります。required:requiredの関係:それぞれVideoに正確に1つのが関連付けられている必要がありますMediaContent。オブジェクトを削除するMediaContentと、関連するVideoオブジェクトが削除される必要があります。

流暢なAPIを使用すると、関係を次のようにモデル化できます。

modelBuilder.Entity<Video.Video>()
            .HasRequired(v => v.MediaContent).WithRequiredPrincipal(mc => mc.Video)
            .WillCascadeOnDelete(true);

この変更をデータベースに反映するために移行を追加する場合、これは、関係が外部キーに関して転記される方法です。

AddForeignKey("MediaContents", "MediaContentId", "Videos", "VideoId", cascadeDelete: true);

データベースを更新すると、次のエラーが発生します。

Cascading foreign key 'FK_MediaContents_Videos_MediaContentId' cannot be created where the referencing column 'MediaContents.MediaContentId' is an identity column.

プロパティWillCascadeOnDelete(true)を削除するとエラーは削除されますが、理由がわかりません。カスケードがオンになっているかどうかに関係なく、エラーが表示されるべきではありませんか?私が問題を理解する方法では、エラーは、の生成が自動インクリメント(またはID生成戦略が何であれ)によって処理され、外部キーの制約と矛盾する可能性があるという事実にVideoId起因MediaContentIdします。しかし、これが削除カスケードと何の関係があるのか​​わかりません...

私は何が欠けていますか?より一般的には、カスケード可能な1対1の必須:必須のEFとの関係をどのようにモデル化するのでしょうか。

4

1 に答える 1

0

私は modelBuilder の粗雑なアプローチを避け、単純な POCO と属性を一般的に使用します。これを使用して、次のように目標を達成できます。

public class Video
{
    public int Id { get; set; }

    // Adding this doesn't change the db/schema, but it is enforced in code if
    // you try to add a Video without a MediaContent.
    [Required]
    public MediaContent MediaContent { get; set; }
}

public class MediaContent
{
    [ForeignKey("Video")]
    public int Id { get; set; }

    public Video Video { get; set;}
}
于 2013-03-31T00:53:59.323 に答える