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

本文关键字:关系 无效 角色 多重性 MVC NET 代码 ASP | 更新日期: 2023-09-27 18:29:18

我有一个简单的关系。活动链接到两个页面。一个页面只能链接到一个市场活动。但我一直遇到这个错误:

System.Data.Edm.EdmAssociationEnd::多重性在Role中无效关系"Page_Campaign"中的"Page_Campaign_Source"。因为Dependent Role属性不是关键属性,而是上限Dependent Role的多重性的必须为"*"。

我浏览了一些示例代码和教程,并将其与我的代码进行了比较,但我没有发现错误。

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

保存不公开外键的实体时出错它们关系的属性

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

在这种情况下,数据注释映射是令人困惑的。使用Fluent API进行配置。删除导航属性映射的数据注释,并按如下方式使用fluent 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设为可为null并调用SaveChanges两次。例如

将关系更改为可为null的

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

我认为你的活动中应该有一个页面集合,而不是两个子实体

我上次用MVC编码已经有一段时间了,但如果我记得正确的话,它应该是这样的:

public virtual Collection<Page> pages

然后在其中放入2页