【问题标题】:ASP.NET MVC Code first: Multiplicity is not valid in Role in relationshipASP.NET MVC 代码优先:多重性在关系中的角色中无效
【发布时间】:2012-03-27 10:47:43
【问题描述】:

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

System.Data.Edm.EdmAssociationEnd: : 多重性在角色中无效 关系“Page_Campaign”中的“Page_Campaign_Source”。因为 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,但现在我得到了:

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

【问题讨论】:

  • 我只是想知道,为什么在campaign类中你只有页面的虚拟对象而没有它们的foreignKey,而在页面类中你有foreignKey和virtual objebt广告系列?
  • RedeemPage 真的是另一个类吗?还是应该是Page
  • @stmnmn 因为外键位于关系的“一”端
  • @Slauma RedeemPage 继承自 Page
  • 您是否尝试过“清理并构建”? ;D

标签: c# asp.net entity-framework


【解决方案1】:

在这种情况下,数据注释映射令人困惑。使用 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,并且您有一对一的映射。因此,要保存一条记录,它需要插入另一行的 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();
}

【讨论】:

  • 似乎合法,我仍然会创建一个接口或抽象超类 Page.. 但不知道整个上下文,所以 w/e:p
  • 我可以将 Fluent API 与数据注释混合使用,对吗? (所以我不必重做所有课程)
  • @SirTroll 您可以混合使用,但在某些情况下,当 EF 与映射混淆时,您可能会遇到问题 :)
  • @Eranga 感谢您的帮助。还有一些问题,我已经更新了OP。
【解决方案2】:

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

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

public virtual Collection<Page> pages

然后您将 2 页放入其中

【讨论】:

  • 一个活动有 2 页(不多也不少)一个常规页面和一个兑换页面。所以我不能使用集合。
  • 所以你说你没有接口或抽象超类?这是什么资源!?
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 2014-07-28
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多