通过 Entity Framework 6.0、Fluent API 和 DataAnnotations 重用所需属性的列

2024-02-27

我有一个基类

public class BaseClass
{
    public int Id {get; set;}
}

和两个派生类

public class Foobar: BaseClass
{
    [Required]
    public int Whatever {get; set;}
}

public class Snafu: BaseClass
{
    [Required]
    public int Whatever {get; set;}
}

我正在使用 Table Per Hierarchy 继承并尝试减少重复的列,因此使用 Fluent API,我将它们映射如下:

        modelBuilder.Entity<Foobar>().Property(fb => fb.Whatever).HasColumnName("Whatever");
        modelBuilder.Entity<Snafu>().Property(sf => sf.Whatever).HasColumnName("Whatever");

然而,这导致

(137,10) :错误 3023:从第 137 行开始映射片段时出现问题:Column BaseClass。必须映射表 BaseClass 中的任何内容:它没有默认值且不可为空。

在 EF6 中,如果我取消这种类型的映射,则似乎可以正常工作[Required]来自两个子类的属性。添加一个[DefaultValue(0)]两个派生类的属性并不能解决问题。

知道如何让这些属性共享数据库中的列,同时维护其所需的属性吗?


这实际上是 EF6 中的一个错误。在 EF5 中,该场景根本不起作用(我们会在“列名称必须是唯一的”行中抛出异常)。在 EF6 中,我们做了一些工作来启用它,但显然我们忽略了这样一个事实:即使派生类型中需要该属性,共享列在数据库中也必须为空。后者是因为除非基类是抽象的,否则您需要能够存储基类型的实例,并且对于基类型的任何实例,该列都应该为 null。

我已将该问题提交到我们的错误数据库中:

https://entityframework.codeplex.com/workitem/1924 https://entityframework.codeplex.com/workitem/1924

请随意投票。

至于解决方法,如果无法选择中间类型,则可以将列标记为可为空,并在实体配置上显式附加对 .IsOptional() 的调用。这不会为您提供所需的信息,因为出于 EF 数据验证的目的,对 Fluent API 上的 IsOptional() 的调用将覆盖 [Required] 数据注释。但是,其他风格的数据验证(例如 MVC 的验证)仍将遵循该属性。

还有其他可能的解决方法我还没有尝试过,也许如果可以接受使用 TPT 并且两个派生类型都具有位于不同表中的任何内容,那么这将起作用。我相信任何依赖于设置默认值的方法都无济于事,因为该错误不仅与表架构无法保存基类的实例有关,还与 Code First 生成的 EF 映射不存在有关。有效的。

UPDATE:这将在实体框架版本 6.1.0 中修复,该版本目前处于测试阶段。

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

通过 Entity Framework 6.0、Fluent API 和 DataAnnotations 重用所需属性的列 的相关文章

随机推荐

  • 如何输出DOM文档?

    也许我遗漏了一些东西 但是这段代码中的 DOM 对象是空的 input file get contents http www google com doc new DOMDocument doc gt loadHTML input supr
  • 如何在 MLPClassifier 中设置初始权重?

    我找不到设置神经网络初始权重的方法 有人可以告诉我如何设置吗 我正在使用 python 包 sklearn neural network MLPClassifier 这是供参考的代码 from sklearn neural network
  • JS 闭包上下文对象的生命周期?

    背景 我正在尝试移植长生不老药演员模型语言原语转换为 JS 我想出了一个解决方案 用JS 来模拟receiveelixir 关键字 使用 接收器 函数和生成器 这是一个简化的实现和演示 向您展示这个想法 APIs type ActorRef
  • 即使使用相同的密钥库,更新 apk SHA1 也会有所不同

    I have uploaded my app to Goggle Play few months back after signing it with a release keystore I have stored that Keysto
  • 检查 exec.Cmd 是否在 Go 中运行完毕

    我正在尝试检查是否exec Cmd 在跑在这些场景中 在我真正开始命令之前 命令开始之后但完成之前 命令完成后 这将允许我终止该命令 如果它正在运行 以便我可以使用不同的参数再次启动它 下面是一个简单的用例 c exec Command o
  • 网络浏览器无法打开新窗口

    我刚刚找到了一份远程工作的新工作 我必须通过打开一堆页面并登录来开始我的一天 我很想自动化这个过程 因为它可能有点乏味 我想保留我的个人浏览窗口并打开一个包含我需要的所有页面的新窗口 这是我想做的事情的要点 import webbrowse
  • iOS 8 / Safari 8 不支持 ASP.NET AJAX 扩展

    iOS 8 推出后 我们的网站突然停止运行 ASP NET UpdatePanel 内的每次回发都会导致一个空页面 如果在 Safari 8 在 Mac 上 中将用户代理设置为 Chrome 它仍然有效 我已经发现 一些 ScriptRes
  • 受歧视工会没有多余的财产检查

    给定的是受歧视的联合类型S1 S2 S3 type S1 d1 foo type S2 d1 bar isSuccess true type S3 d1 baz isSuccess false errorMessage string typ
  • Google App Engine:添加到任务队列比执行数据存储写入更快吗?

    我正在尝试通过将后台任务添加到任务队列而不是立即执行操作来优化应用程序的一些面向用户的部分 对于 CPU 密集型任务来说 这样做是一个明显的选择 但是如果只是保存数据呢 平均而言 执行 taskqueue add 操作或 db put 操作
  • 如何切换标记?

    我制作标记的代码 for var marker in markers var posMarker new google maps Marker position new google maps LatLng markers marker l
  • 重定向多个标准输入?

    我有三个文件 名为一 二 三 其中一项包含 1 3 2 两个包含 4 6 5 三包含 7 9 8 当我发出以下命令时 sort lt One lt Two lt Three 我得到输出 7 8 9 但是当我发出以下命令时 sort One
  • 使用 Inno Setup 安装时应用程序无法运行

    我正在开发桌面数据库应用程序 使用rdlc报告和reportviewer 开发过程中一切顺利 reportviewer 可以顺利显示所有数据 我使用 Inno Setup 部署应用程序 但是当我安装该应用程序时 报告查看器不显示数据 当数据
  • jsPDF/html2canvas 通常会丢失空格和文本错位

    我正在使用 html2canvas 和 jsPDF 生成 pdf 客户端 无论我选择什么设置 我都会在 html 到 pdf 渲染中丢失字母空格 有设置可以解决这个问题吗 我已经检查了 API 并更改了我能想到的所有可能的设置 但间距没有改
  • 如何从android服务获取返回值

    我遇到的问题是我不知道如何从服务中获取返回值 为什么我想要从服务返回值是我想在活动页面中显示这个返回值 以下是我的服务文件 返回值是retvalue public class SyncService extends Service priv
  • iPhone ios 上的 swift 3 中的弹出窗口

    我正在尝试使用以下代码制作弹出菜单 import UIKit class BeobachtungViewController UIViewController UIPopoverPresentationControllerDelegate
  • Android N 预览版不允许传输至 myserver.com 的明文 HTTP 流量

    昨天我获得了 Android N 预览版的新升级 自从我升级后 我就无法再启动我的应用程序了 java io IOException Cleartext HTTP traffic to myserver com not permitted
  • 如何在Windows中保存.env文件?

    我尝试保存文件 env文件扩展名 但我看不到任何 env另存为下拉选项中的文件扩展名 我也尝试将其重命名为 env但它被保存为文本文件 参见屏幕截图 我该如何解决这个问题 如果您使用 Windows 要保存扩展名与您正在使用的工具的默认扩展
  • 在 SQL 中编写左/右 JOIN 时,您是否使用 OUTER 关键字?

    我经常看到有人这样写SQL SELECT from TableA LEFT OUTER JOIN TableB ON ID1 I2 我自己简单写一下 SELECT from TableA LEFT JOIN TableB ON ID1 I2
  • Jetpack Compose 中可调整大小的 BasicTextField

    有没有办法在 Jetpack Compose 中生成可调整大小的 BasicTextField 以便在用户输入或删除字符时其宽度会环绕文本大小 他们已经解决了 flutter 的类似问题 但我没有找到如何为 Compose 解决这个问题 F
  • 通过 Entity Framework 6.0、Fluent API 和 DataAnnotations 重用所需属性的列

    我有一个基类 public class BaseClass public int Id get set 和两个派生类 public class Foobar BaseClass Required public int Whatever ge