1

私は2つのエンティティを持っています、

  • ニュース
  • 添付ファイル

各ニュースに 0、1、または複数の添付ファイルを含めることができるように、コード ファーストの流暢な API を使用して構成したいと考えていました。

ここに私が今使っているものがあります

   public NewsMap()
    {
        this.ToTable("News"); // Table Name
        this.HasKey(m => m.Id); // Primary Key

        // Field Definition            
        this.Property(m => m.Title).HasMaxLength(255).IsRequired();
        this.Property(m => m.Body).HasColumnType("Text").IsRequired();
        this.Property(m => m.Summary).HasMaxLength(1000).IsRequired();
        this.Property(m => m.AuthorId).IsRequired();

        this.Property(m => m.CreatedOn).IsRequired();
        this.Property(m => m.UpdatedOn).IsRequired();

        this.HasMany(m => m.Attachments).WithMany().Map(m => m.MapLeftKey("NewsId").MapRightKey("AttachmentId"));
    }

public class FileAttachmentMap : EntityTypeConfiguration<FileAttachment>
{
    public FileAttachmentMap()
    {
        this.ToTable("FileAttachments"); // Table Name
        this.HasKey(m => m.Id); // Primary Key

        // Field Definition            
        this.Property(m => m.DisplayName).HasMaxLength(256).IsRequired();
        this.Property(m => m.PhysicalFileName).HasMaxLength(256).IsRequired();
        this.Property(m => m.Extension).HasMaxLength(50).IsRequired();
        this.Property(m => m.IsImage).IsRequired();
        this.Property(m => m.ThumbTiny).HasMaxLength(275).IsOptional();
        this.Property(m => m.ThumbSmall).HasMaxLength(275).IsOptional();
        this.Property(m => m.ThumbMid).HasMaxLength(275).IsOptional();
        this.Property(m => m.ByteSize).IsRequired();
        this.Property(m => m.StorageType).IsRequired();   

        this.Property(m => m.CreatedOn).IsRequired();
        this.Property(m => m.UpdatedOn).IsRequired();
    }
}

このマッピングは、次の 2 つのフィールドを持つ NewsFileAttachment という名前の中間テーブルを正しく生成します。

  • ニュースID
  • 添付ファイル ID

News.Attachments.Add(Attachment); を呼び出すと、ニュース エンティティで Attachment テーブルと NewsAttachment テーブルの両方にレコードを正しく追加します。

News.Attachments からいくつかのリスト アイテムを削除すると、NewsAttachment テーブルからレコードが正しく削除されますが、FileAttachment テーブルのレコードは削除されません。それも消したかった。

これを実現するためのより良い Fluent API 構成を提案してもらえますか?

ありがとう、アミット

EDIT

私の場合、FileAttachment はさまざまな目的でファイルを保存します。私も添付ファイルを持つブログエンティティを持っています。つまり、BlogAttachments と FileAttachments の 2 つの中間テーブルです。ここで、WithOptional を使用する場合 (FileAttachment テーブルに BlogId と NewsId の両方が必要なため、WithRequired は使用できません)、中間テーブルを取り除くことができますが、削除しても FileAttachment テーブルからレコードは削除されず、NewsId/ を作成するだけです。ブログ ID NULL。

なにか提案を?主なことは、FileAttachment テーブルにあるすべてのフィールドを含む個別のテーブルを作成したくないということです。

4

1 に答える 1

0

多対多の余分なテーブルが作成されるため、カスケードはそのテーブルにのみ適用されます。

結合テーブルを通過するため、Newsと の間に直接の「FK」関係はありません。Attachmentしたがって、ニュースが削除されたとしても、たとえば添付ファイルが削除されることは期待できません。添付ファイルに関連する他のニュースが含まれている可能性があるためです。

これも参照してください - それは多少関連しています。
EF Code First を使用した Join Table との 1 対多の関係

つまり、構造が許可する場合は、多対多を明示的に作成しないでください (両側にコレクションを置かないでください。または流暢な構成で同様のものを作成しないでください)。

あなたの場合、あなたの「添付ファイル」がその間に再利用可能ではないことを提供しますNews-次に、コレクションナビゲーションプロパティを配置し、News添付ファイルを何も残さずに残すか、添付ファイルから「FK」、単一インスタンスナビゲーションを作成します(「親」のように) ) 必要な場合。

一方、attach...別のレコードを親にすることができる 場合は、newsカスケード削除を行うべきではありません。

注: 生成された移行スクリプト (または SQL/Db) をチェックして、それが作成するものを正確に確認し、中間テーブルが作成されていないことと、「添付ファイル」から「ニュース」に移動する「FK」が 1 つだけであることを確認してください。

編集:

modelBuilder.Entity<News>()
    .HasMany(c => c.Attachments)
    .WithOptional() // or WithRequired (test to see which is better for you)
    .WillCascadeOnDelete(true);

...そしてpublic ICollection<FileAttachment> Attachments {get;set;}、ニュースで 1 つ作成します。
(実際には、必要なのはコレクション プロパティだけです。ただし、構成は、必要なものを安全に取得するためのものです)

これにより、データの性質である 1 対多 (または多対 1) になります (コメントで述べたように)。また、カスケード削除を行うことができます。

于 2013-04-12T14:41:33.527 に答える