asp.net-mvc – ASP.NET MVC6中的实体框架7多个外键到同一个表
嗨我有同样的问题,这里的旧帖子,解决方案提供在我的MVC 6与EF7不起作用是简单的
public class Match { [Key] public int MatchId { get; set; } public DateTime playday { get; set; } public float HomePoints { get; set; } public float GuestPoints { get; set; } public int HomeTeamId { get; set; } public int GuestTeamId { get; set; } [ForeignKey("HomeTeamId")] [InverseProperty("HomeMatches")] public virtual Team HomeTeam { get; set; } [ForeignKey("GuestTeamId")] [InverseProperty("AwayMatches")] public virtual Team GuestTeam { get; set; } } public class Team { public int TeamId { get; set; } public String name { get; set; } public virtual ICollection<Match> HomeMatches { get; set; } public virtual ICollection<Match> AwayMatches { get; set; } } 这是我找到的最好的方法,因为我可以添加一个新的迁移,一切都没问题,但是当我更新数据库时,我得到一个像这样的错误
解决方法
我在准备
the answer时详细分析了这个问题,我可以建议你解决这个问题.
由于Match类中的两个属性存在问题 public int HomeTeamId { get; set; } public int GuestTeamId { get; set; } 以及将生成的外键HomeTeamId和GuestTeamId. EF7使用ON DELETE CASCADE生成外键,不能将其用作一个外键.实体框架(RC1)的当前实现没有注释属性,您可以使用它来更改行为. 该问题的第一个解决方案是使用可空的属性,如 public int? HomeTeamId { get; set; } public int? GuestTeamId { get; set; } 要么 public int HomeTeamId { get; set; } public int? GuestTeamId { get; set; } 最多一个属性应该是不可为空的.结果问题将得到解决,但是会有一个小缺点,这对某些情况可能并不重要. nullable属性的数据库表中的字段在列定义中没有NOT NULL属性. 如果确实需要同时保持HomeTeamId和GuestTeamId不可为空,那么您可以通过修改上下文类(继承自DbContext)来解决问题,其中使用Match和Team类. 您已经在下面定义了一些上下文类 public class MyDBContext : DbContext { DbSet<Team> Teams { get; set; } DbSet<Match> Matches { get; set; } } 要解决描述问题,可以在显式设置的类中添加受保护的OnModelCreating public class MyDBContext : DbContext { protected override void OnModelCreating(ModelBuilder modelbuilder) { base.OnModelCreating(modelbuilder); modelbuilder.Entity(typeof (Match)) .HasOne(typeof (Team),"GuestTeam") .WithMany() .HasForeignKey("GuestTeamId") .OnDelete(DeleteBehavior.Restrict); // no ON DELETE modelbuilder.Entity(typeof (Match)) .HasOne(typeof (Team),"HomeTeam") .WithMany() .HasForeignKey("GuestTeamId") .OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE } DbSet<Team> Teams { get; set; } DbSet<Match> Matches { get; set; } } 您可以在两个外键上使用原因DeleteBehavior.Restrict(而不是在一个外键上使用DeleteBehavior.Cascade).重要的是要注意,最后一种方法允许将HomeTeamId和GuestTeamId(如数据库中的相应字段)保持为不可为空. 有关其他信息,请参见the documentation. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net页面SqlCacheDependency缓存实例
- asp.net – 餐厅后端系统和.Net
- 一张图理清ASP.NET Core启动流程
- asp.net-mvc – 在另一个文件夹中捆绑的Javascript
- asp.net-mvc – 在MVC3中使用两个可选参数的路由不起作用
- 【译】ASP.NET Core在 .NET Core 3.1 Preview 1中的更新
- 如何刷新#include文件 – 它们在IIS7 / ASP.NET上进行缓存
- 从Asp.net中的Pdf读取文本
- asp.net-mvc – 在REST Web API调用中返回复杂对象
- asp.net – updatepanel中的文本框的问题 – 不会导致OnTex
- asp.net-mvc – 实体框架:已经有一个与此命令关
- asp.net – 是否可以使用Membership API更改用户
- asp.net-mvc – MVC 3:使用EditorForModel隐藏I
- asp.net – 添加GridTemplateColumn会破坏RadGri
- 在代理服务器后面设置ASP.NET应用程序的基本URL
- 在ASP.net应用程序中处理Com对象
- asp.net-mvc-2 – 在ASP.Net MVC 2中的整个站点中
- asp.net-mvc – 为什么调用base.OnActionExecuti
- asp.net-web-api – spotify请求的限制
- asp.net – 如何在回发触发器中添加进度条