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)
后的问题是Campaign
和Page
都有自动递增的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页