ASP.NET MVC6 中的实体框架7对同一个表的多个外键

2023-12-10

您好,我有同样的问题,这里有一篇旧文章,那里提供的解决方案在带有 EF7 的 MVC 6 中对我不起作用很简单

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

这是我发现的最好的方法,因为我可以添加新的迁移,一切都很好,但是当我更新数据库时,我收到这样的错误

在表“Match”上引入 FOREIGN KEY 约束“FK_Match_Team_HomeTeamId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。请参阅以前的错误。


我在准备的时候详细分析了问题答案我可以建议你解决这个问题的两种方法。

问题的存在是由于类中的两个属性Match

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

和外键HomeTeamId and GuestTeamId将生成。 EF7 生成外键ON DELETE CASCADE,它不能用作一个外键。实体框架 (RC1) 的当前实现没有注释属性,您可以使用它来更改行为。

问题的第一个解决方案是使用可空属性,例如

public int? HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }

or

public int HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }

最多有一个属性不能为 null。结果,问题将得到解决,但会有一些小缺点,这对于某些场景来说可能并不重要。数据库表中可空属性的字段将没有NOT NULL列定义中的属性。

如果您确实需要同时持有两者HomeTeamId and GuestTeamIdnon-nullable 那么你可以通过修改上下文类(继承自DbContext)来解决问题,其中类Match and 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 and GuestTeamId,就像数据库中的相应字段一样,不可为空。

See 文档获取更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC6 中的实体框架7对同一个表的多个外键 的相关文章

  • 从 SQLCE 4 迁移到 SQL Server 2008

    因此 作为早期采用者 我开发了一个基于 SQLCE4 ASP Net MVC3 和实体框架CTP5 http www microsoft com downloads en details aspx FamilyID 35adb688 f8a
  • 实体框架:数据库上下文可以在不同模式之间拥有外键吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个具有多个模式的数据库 公司架构师希望每个架构都有实体框架 DbContext 此外 不同模式之间还存在外键关系 今天在搭建架
  • 如何分配Profile值?

    我不知道我缺少什么 但我在 Web config 文件中添加了 Profile 属性 但无法访问 Profile Item在代码中或创建一个新的配置文件 我今天也遇到了同样的问题 学到了很多东西 Visual Studio 中有两种项目 网
  • 我可以将 JSON 字符串转换为 JsonResult 吗?

    我在数据库中存储了一些存储的 JSON 字符串 我想将其作为 JsonResult 返回给客户端 我知道 Json object 将对象转换为 JsonResult 但如果我已经将结果存储在字符串中怎么办 我可以将其转换为 JsonResu
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • asp.net MVC 1.0和2.0货币模型绑定

    我想创建模型绑定功能 以便用户可以输入 等等 用于绑定到我的 ViewModel 的双精度值的货币值 我能够在 MVC 1 0 中通过创建自定义模型绑定器来执行此操作 但是自从升级到 MVC 2 0 后 此功能不再起作用 有谁有任何想法或更
  • MVC3 中定义路由的文件

    我有这个文件
  • ASP.NET 视图中的区域?

    我正在使用 razor 引擎制作 ASP NET MVC 应用程序 我想知道是否可以使用Regions http msdn microsoft com en us library 9a1ybwek aspx在一个视图中 就像是 region
  • 如何制作像Stackoverflow一样的可折叠评论框

    我正在构建一个网站 并且有一个状态更新列表 我希望允许用户为列表中的每个项目撰写评论 但是我正在尝试实现一个类似于堆栈溢出工作方式的用户界面 特别是可折叠的评论表单 列表 用户在其中单击对列表中的特定状态更新添加评论 并且在列表中的该项目下
  • T4MVC Base 控制器没有默认构造函数

    我的控制器是从另一个没有默认构造函数的控制器继承的 T4MVC 生成以下构造函数 假设基本控制器具有默认构造函数 protected MyControllerController Dummy d 我该如何解决这个问题 有趣的是 根据this
  • ASP.NET MVC - 临时要求除一页之外的整个站点授权的简单方法

    我正在建立一个混合了公共页面和会员专用页面的网站 登录系统按原样工作正常 不过 我想启动一个封闭的 仅限邀请的预览 并暂时要求访问者登录才能执行除欢迎页面之外的所有操作 目前我有 Authorize 某些操作方法的属性 我也可以向其他操作方
  • 更改实体的可访问性

    我想建立一个内部实体 我已将实体 其标量属性和导航属性更改为内部 当我尝试构建它时出现此错误 错误 6036 EntityType 文件 具有 内部 可访问性 EntitySet 文件 具有具有 公共 可访问性的 get 属性 Entity
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 盒式捆绑包与 MVC4 捆绑包

    我目前正在开发一个原型 ASP NET MVC 3 解决方案 该解决方案将用作多个项目重写的基础 来自 Web 表单 我的目标之一是跨应用程序实现一些脚本管理 而不是我们目前没有的目标 MVC 3有一个缺陷恕我直言 如果您需要在部分视图或模
  • ASP.NET MVC2:“System.MissingMethodException:没有为此对象定义无参数构造函数。”

    我目前正在尝试修改默认 MVC 项目的注册组件 以适应我的项目 为此 我修改了 RegisterModel Register aspx 和 AccountController 我可以很好地查看寄存器视图 但是当我提交时 我在标题中收到错误
  • 当我的模型为空时,如何避免视图内的 foreach 循环中出现 NullReferenceException?

    当我通过控制器传入 null 值时 我的视图中收到以下代码的 NullReferenceException 未由用户代码处理 错误 在某些情况下 我想传入 null 值 但我不希望发生这种情况时引发错误 我应该将我的代码更改为什么 最初我的
  • 如何在VS2010中获取T4来迭代类的属性

    我使用的是 Visual Studio 2010 并且安装了有形的 T4EditorPlusModellingTools 我只是在玩T4 以前从未接触过它 我想做的是查看项目中的一个类 并写出每个属性 谁能给我关于如何构建 tt 文件的绝对
  • 如何直接在 Razor 中从 ASP.NET Identity 获取 UserId() 方法

    我的某些部分的自定义授权存在此问题Views 我不想穿上PartialView 而不是我使用If声明如下 if item CurrentComment Id Guid Parse ViewBag UserId repository IsUs
  • 如何访问Web api控制器中的mvc控制器以从视图中获取pdf

    我为单页 Web 应用程序创建了 Web Api 和 MVC 组合 我想调用 Web api 并渲染 mvc 控制器以使用 Rotativa api 从视图创建 pdf 问题是当我在 Web api 中访问 mvc 控制器时它不起作用 我如
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP

随机推荐

  • Ajax 表单与 Google 隐形 Recaptcha

    我的代码 function onSubmit token document ready function submit click function var name name val var email email val var pas
  • 如何将第一响应者从一个 UIView“转移”到另一个 UIView?

    我有一个 UIView 子类 CustomView出于这个问题的目的 它有自己的所有处理touches事件 开始 移动 结束 取消 我也有一个UIButton这是一个兄弟姐妹CustomView与它重叠的 例如 我的视图层次结构如下所示 U
  • 如何在 VB.NET 中填充组合框

    我有一个代码来填充我的组合框 但每次我关闭表单时 列表都会加倍 如果我关闭表单并再次打开它后 我的英语 数学 科学数据库中有一个列表 则列表现在显示为英语 数学 科学 英语 数学 科学 这是代码 Call OpenDB cmd Comman
  • 雪花支持ssl吗?

    您好 我希望能够使用 ssl 从 jdbc 驱动程序连接到雪花 我对其他数据库做了很多次 只需在连接 url 中添加 ssl true 有时是其他属性 不幸的是我在雪花文档中没有找到这个选项 我发现雪花支持像 ssl 这样的东西 他们称之为
  • 从模块导出函数时,延迟绑定脚本块不起作用

    我有以下功能 function PipeScript param Parameter ValueFromPipeline Object InputObject Object ScriptBlock process value Invoke
  • Rails 3 中的猴子修补

    Rails 3 中 Monkey Patch 的首选方式是什么 我只想向 String 类添加一个方法 我更关注将文件放置在哪里 初始化程序目录是收集所有这些小碎片的好地方 由于我倾向于对核心扩展有点过度 所以我喜欢在那里创建一个名为 扩展
  • 使用注册表检测安装的MS Office是32位还是64位

    我想根据excel版本 32位或64位 安装vsto addin 我计划捆绑 32 位和 64 位 msis 并通过确定 Excel 版本来安装一个 我可以找到这个链接来使用注册表检测2010 Office是32位还是64位 通过注册表检测
  • pytest 2.3 在类中添加拆卸

    我正在研究新版本的 pytest 2 3 并对新功能感到非常兴奋 您可以在其中使用 可以通过注册一个或多个来精确控制拆卸 一旦执行了一些操作 拆卸功能 需要撤消 消除了单独 拆卸 的需要 装饰器 from here 作为函数使用就很清楚了
  • 如何打印树形结构?

    我正在努力提高我们应用程序的性能 我以调用树的形式获得了性能信息 具有以下节点类 public class Node public string Name method name public decimal Time time spent
  • Shiny:将 styleColorBar 与来自两个数据帧的数据一起使用

    我正在尝试在 Shiny 中显示一个表格 其中数字将从一个 data frame 或 data table 显示 但条形的大小将从另一个 data frame 获取 例如 将显示绝对值 但来自另一个表 相同排列 的 log p values
  • 如何在android中以编程方式取消闹钟? [复制]

    这个问题在这里已经有答案了 我使用这段代码创建了一个警报并且它有效 请建议如何取消该警报 Intent alarmIntent new Intent AlarmClock ACTION SET ALARM alarmIntent setFl
  • 使用用例图将数据库作为参与者,以及整个图的正确性

    如果我需要将数据库识别为参与者 我会陷入困境并感到困惑 因为数据库是在场景中给出的 我首先尝试将其作为演员 因为根据场景 所需的数据来自数据库 我还尝试为整个场景创建一个用例 但不确定是否正确 这是场景的链接 https justpaste
  • 将两个二进制文件合并为第三个二进制文件

    我正在尝试将两个二进制文件合并到Python 中的第三个二进制文件 我的代码 input1 input2 input1 open input1 bin read input2 open input2 bin read input1 inpu
  • Directx 11 前缓冲器

    我希望这是对一个我找不到答案的简单问题的简单答案 如何访问 Directx 11 DXGI 中的前端缓冲区 我发现在 Directx 9 中可以使用 GetFrontBufferData 在 Directx 11 中可以使用 GetBuff
  • 如何优化目录列表? (enumeratorAtPath和递归调用contentsOfDirectoryAtPath)

    我编写了一个方法 getDirTree1 使用推荐的类 NSDirectoryEnumerator 和方法 nextObject 列出从根目录开始的所有目录 但是 当它运行时 会使用大量内存 主要是私有类 NSPathStore2 这是不可
  • VHDL——连接开关和LED

    我有 Xilinx Spartan6 和下一个 VHDL 代码 library ieee use ieee std logic 1164 all use ieee numeric std all entity Switches Leds i
  • android,UTF8 - 如何确保 UTF8 用于共享首选项

    如何确保共享首选项菜单使用 UTF8 我有一个 android 首选项菜单 允许用户设置他们的名字等 我需要知道如何将共享首选项中存储的数据转换为 UTF8 格式 首选项菜单使用 utf8 编码以 xml 格式布置在 res xml 文件夹
  • 具有相同方法名称但不同限定符的 Spring bean 无法加载

    我有两个 Spring Configuration 类定义如下 Configuration public class ClsA Bean Qualifier ClasA public String getSomething return s
  • 如何在烧瓶响应中返回图像?

    举个例子 这个网址 http example com get image type 1 应该返回一个响应image gifMIME 类型 我有两个静态 gif images 如果类型是 1 它应该返回ok gif 否则返回error gif
  • ASP.NET MVC6 中的实体框架7对同一个表的多个外键

    您好 我有同样的问题 这里有一篇旧文章 那里提供的解决方案在带有 EF7 的 MVC 6 中对我不起作用很简单 public class Match Key public int MatchId get set public DateTim