2017-04-25 20 views
0

重複レコードが発生するため、多対多の関係に問題があります。EF多くの原因が重複の原因

私はそれらのクラスがあります。

class Flyer { Id, virtual ICollection<FlyerPage> Pages } 

class FlyerPage { Id, FlyerId, virtual Flyer Flyer, ICollection<FlyerPageKeyword> Keywords } 

そして

class FlyerPageKeyword { Id, Key, virtual ICollection<FlyerPage> Pages } 

のでFlyerPageFlyerPageKeywordは、多くの多くのです。それは動作し、レコードはDBに保存されます。

しかし、キーワードの重複も追加されます。

私のコンテキスト:私はそれを動作させるよう

public class Context : DbContext 
{ 
    public Context() : base("name=DbConnectionString") 
    { 
     Database.SetInitializer(new CreateDatabaseIfNotExists<Context>()); 
    } 

    public virtual DbSet<Flyer> Flyers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     modelBuilder.Configurations.Add(new FlyersEntityConfiguration()); 
     modelBuilder.Configurations.Add(new FlyersPageEntityConfiguration()); 
     modelBuilder.Configurations.Add(new FlyersPageKeywordsEntityConfiguration()); 
    } 
} 



public class FlyersEntityConfiguration : EntityTypeConfiguration<Flyer> 
{ 
    public FlyersEntityConfiguration() 
    { 
     this.Map(flyer => flyer.ToTable("Flyer", "Flyers")); 

     this.HasMany(flyer => flyer.Pages) 
      .WithRequired(page => page.Flyer) 
      .HasForeignKey(page => page.FlyerId); 
    } 
} 

public class FlyersPageEntityConfiguration : EntityTypeConfiguration<FlyerPage> 
{ 
    public FlyersPageEntityConfiguration() 
    { 
     this.Map(pages => pages.ToTable("Page", "Flyers")); 
     this.HasMany(page => page.Keywords).WithMany(keywords => keywords.FlyerPages).Map(cfg => 
     { 
      cfg.ToTable("PageKeywords", "Flyers.Page"); 
      cfg.MapLeftKey("FlyerPageId"); 
      cfg.MapRightKey("KeywordId"); 
     }); 
    } 
} 
public class FlyersPageKeywordsEntityConfiguration : EntityTypeConfiguration<FlyerPageKeyword> 
{ 
    public FlyersPageKeywordsEntityConfiguration() 
    { 
     this.ToTable("Keyword", "Flyers.Page"); 
    } 
} 

そしてFlyerが集約ルートです。キーワードのみを保存することはできません。

var context = new Context(); 
     var flyer = new Flyer 
     { 
      Pages = new List<FlyerPage> 
      { 
       new FlyerPage 
       { 
        Id = Guid.NewGuid(), 
        Keywords = new List<FlyerPageKeyword> {new FlyerPageKeyword {Key = "One"}} 
       }, 
       new FlyerPage 
       { 
        Keywords = new List<FlyerPageKeyword> {new FlyerPageKeyword {Key = "Two"}} 
       } 
      } 
     }; 
     context.Flyers.Add(flyer); 
     context.SaveChanges(); 
+0

のようになります 'FlyerPage'と'同じ(タイプミス)をFlyerPages'ですか? – grek40

+0

はい、それはスペルミスです。 – Nerf

+0

問題点を明確にすることはできますか? 'FlyerPageId、KeywordId'の組み合わせはあなたの現在のデザインによって一意でなければなりません。 –

答えて

1

、あなたのチラシの割り当ては

var context = new Context(); 
     var flyer = new Flyer 
     { 
      Pages = new List<FlyerPage> 
      { 
       new FlyerPage 
       { 
        Id = Guid.NewGuid(), 
        Keywords = new List<FlyerPageKeyword> 
         { 
          context.Keywords.FirstOrDefault(x => x.Key == "One") ?? new FlyerPageKeyword {Key = "One"} 
         } 


       }, 
       new FlyerPage 
       { 
        Keywords = new List<FlyerPageKeyword> 
         { 
          context.Keywords.FirstOrDefault(x => x.Key == "Two")?? new FlyerPageKeyword {Key = "Two"} 
         } 
       } 
      } 
     }; 
     context.Flyers.Add(flyer); 
     context.SaveChanges(); 
2

基本的にはそのすべて新しいものを作成する前に、既存のキーワードエントリを使用してについて:

someKeyword = context.Keywords.FirstOrDefault(x => x.Key == "One") ?? new FlyerPageKeyword {Key = "One"}; 

あなたはすでに存在しているだけでnewキーワードは、あなたがあなたの重複を取得する場合。重複を避けるために

関連する問題