重複レコードが発生するため、多対多の関係に問題があります。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 }
のでFlyerPage
とFlyerPageKeyword
は、多くの多くのです。それは動作し、レコードは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();
のようになります 'FlyerPage'と'同じ(タイプミス)をFlyerPages'ですか? – grek40
はい、それはスペルミスです。 – Nerf
問題点を明確にすることはできますか? 'FlyerPageId、KeywordId'の組み合わせはあなたの現在のデザインによって一意でなければなりません。 –