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,但现在我得到了:
保存不公开外键的实体时出错它们关系的属性
在这种情况下,数据注释映射是令人困惑的。使用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)
后的问题是Campaign
和Page
都有自动递增的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页