В этом сценарии отображение аннотаций данных сбивает с толку.Используйте Fluent API для настройки.Удалите аннотации данных для сопоставления навигационных свойств и используйте свободный API следующим образом.
class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Campaign>().HasRequired(x => x.LandingPage)
.WithMany();
modelBuilder.Entity<Page>().HasRequired(x => x.Campaign)
.WithMany()
.HasForeignKey(x => x.campaignID);
base.OnModelCreating(modelBuilder);
}
}
Редактировать
Проблема после установки WillCascadeOnDelete(false)
заключается в том, что оба Campaign
и Page
имеет автоматически увеличивающиеся PK, и у вас есть сопоставление 1 к 1.Следовательно, чтобы сохранить одну запись, ей нужен идентификатор другой вставленной строки, а другой строке нужен идентификатор 1-й строки.
Вы можете либо изменить PK на GUID, либо сделать 1 FK обнуляемым ипозвоните SaveChanges
дважды.Например,
Изменение отношения к nullable
modelBuilder.Entity<Campaign>().HasOptional(x => x.LandingPage)
.WithMany();
using(var scope = new TransactionScope())
{
context.Campaigns.Add(campaign);
context.SaveChanges();
page.CampaignId = campaign.CampaignId;
context.Pagess.Add(page);
context.SaveChanges();
scope.Complete();
}