ASP.NET MVC代码优先:多重性在关系中的角色中无效

我有一个简单的关系。 广告系列链接到两个页面。 页面只能链接到一个广告系列。 但我一直遇到这个错误:

System.Data.Edm.EdmAssociationEnd ::多重性在关系’Page_Campaign’中的角色’Page_Campaign_Source’中无效。 由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“*”。

我查看了一些示例代码和教程,同时将它与我的代码进行比较,但我找不到错误。

public class Campaign { [Key()] public int Campaignid { get; set; } public string Name { get; set; } public virtual Page LandingPage { get; set; } public virtual RedeemPage RedeemPage { get; set; } } public class Page { [Key()] public int PageContentId { get; set; } public string Logo { get; set; } public string Css { get; set; } [ForeignKey("Campaign")] public int campaignID { get; set; } public virtual Campaign Campaign { get; set; } } 

编辑

跟随Eranga的回复并使用了Fluent API,但现在我得到了:

保存不公开其关系的外键属性的实体时发生错误

在这种情况下,数据注释映射令人困惑。 使用Fluent API进行配置。 删除导航属性映射的数据注释,并使用如下的流畅API。

 class MyContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().HasRequired(x => x.LandingPage) .WithMany(); modelBuilder.Entity().HasRequired(x => x.Campaign) .WithMany() .HasForeignKey(x => x.campaignID); base.OnModelCreating(modelBuilder); } } 

编辑

设置WillCascadeOnDelete(false)后的问题是CampaignPage都有自动递增的PK并且您具有1对1映射。 因此,要保存一个记录,它需要另一个插入行的Id,而另一行需要第一行的id。

您可以将PK更改为GUID,也可以将1 FK设置为​​可空,并调用SaveChanges两次。 例如

将关系更改为可空

  modelBuilder.Entity().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(); } 

我认为您的广告系列中应该有一组网页,而不是2个子实体,

自从我上次编写MVC以来已经有一段时间但是如果我没记错的话应该是这样的:

 public virtual Collection pages 

然后你把你的2页