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

时间:2012-03-27 10:47:43

标签: c# asp.net entity-framework

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

  

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,但现在我得到了:

  

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

2 个答案:

答案 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)后的问题是CampaignPage都有自动递增的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页