C# ASP.NET MVC代码优先:多重性在关系中的角色中无效
我有一段简单的关系。活动链接到两个页面。一个页面只能链接到一个活动。但我一直遇到这样的错误: System.Data.Edm.EdmAssociationId::多重性在角色中无效 关系“Page\u Campaign”中的“Page\u Campaign\u Source”。因为 依赖角色属性不是键属性,而是上限 依赖角色的多重性必须为“*” 我查看了一些示例代码和教程,并将其与我的代码进行了比较,但没有发现错误C# ASP.NET MVC代码优先:多重性在关系中的角色中无效,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一段简单的关系。活动链接到两个页面。一个页面只能链接到一个活动。但我一直遇到这样的错误: System.Data.Edm.EdmAssociationId::多重性在角色中无效 关系“Page\u Campaign”中的“Page\u Campaign\u Source”。因为 依赖角色属性不是键属性,而是上限 依赖角色的多重性必须为“*” 我查看了一些示例代码和教程,并将其与我的代码进行了比较,但没有发现错误 public class Campaign { [Ke
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,但现在我得到: 保存不公开外键的实体时出错 关系的属性
我认为你的活动应该有一个页面集合,而不是两个子实体 自从我上次在MVC中编写代码以来已经有一段时间了,但如果我没记错的话,应该是这样的:
public virtual Collection<Page> pages
公共虚拟收藏页
在这种情况下,数据注释映射很容易混淆。使用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);
}
}
我只是想知道,为什么在campaign类中只有页面的虚拟对象,而没有页面的foreignKey,而在page类中既有活动的foreignKey,又有活动的虚拟对象?RemaindPage真的是另一个类吗?或者它实际上应该是
Page
?@stmnmn,因为外键位于关系的“一侧”ship@Slauma赎回页面继承自页面您是否尝试过“清理并生成”功能;一个活动有两页(不多也不少),一页是常规版,一页是兑换版。所以我不能使用集合。那么你是说你没有接口或抽象超类?这是什么样的资源!?似乎是合法的,但我还是会制作一个接口或抽象超类页面。。但是我不知道整个上下文,所以w/e:pI可以将Fluent-API与数据注释混合在一起,对吗?(所以我不必重做我所有的类)@SirTroll你可以混合,但在某些情况下,当EF与映射混淆时,你可能会遇到问题:)@Eranga谢谢你的帮助。还有一些问题,我已经更新了OP。
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();
}