我有一个简单的关系。广告系列与两个页面相关联。页面只能链接到一个广告系列。但我一直遇到这个错误:
System.Data.Edm.EdmAssociationEnd :: Multiplicity在Role中无效 关系'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,但现在我得到了:
保存不公开外键的实体时发生错误 他们关系的属性
答案 0 :(得分:2)
在这种情况下,数据注释映射令人困惑。使用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映射。因此,要保存一个记录,它需要另一个插入行的Id,而另一行需要第一行的id。
您可以将PK更改为GUID,也可以将1 FK设置为可为空,然后两次调用SaveChanges
。例如
将关系更改为可空
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();
}
答案 1 :(得分:0)
我认为您的广告系列中应该有一系列网页,而不是2个子实体,
自从我上次编写MVC以来已经有一段时间了,但如果我没记错的话应该是这样的:
public virtual Collection<Page> pages
然后你把你的2页