主键违规:使用 EF Code First 进行继承

2023-11-29

我有以下 EF 代码第一个代码。我收到以下异常:

“GiftCouponPayment”不包含标识列。

表已在数据库中成功创建。然而,我怎样才能摆脱这个异常呢?另外,这个异常的原因是什么?

注意:只要保留域模型(首先使用代码描述)(并且可以查询数据),我就可以接受任何表模式。

enter image description here

继续这个异常之后,又出现了一个异常,如下:

保存未公开其关系的外键属性的实体时发生错误。 EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。有关详细信息,请参阅内部异常。

{“违反主键约束'PK_dbo.PaymentComponent'。无法在对象'dbo.PaymentComponent'中插入重复的键。\r\n该语句已终止。”}

参考:

  1. 实体框架:将表拆分为多个表

Note:生成的数据库架构如下所示。

enter image description here

Code:

public class MyInitializer : CreateDatabaseIfNotExists<NerdDinners>
{
    //Only one identity column can be created per table.
    protected override void Seed(NerdDinners context)
    {
        //context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX IX_Payment_PayedTime ON Payment (PayedTime)");
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('Payment', RESEED, 1)");
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('GiftCouponPayment', RESEED, 2)");
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('ClubCardPayment', RESEED, 3)");
    }
}

//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{
    public NerdDinners(string connString): base(connString)
    { 
    }

    protected override void OnModelCreating(DbModelBuilder modelbuilder)
    {
        //Fluent API - Plural Removal
        modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();

        //Fluent API - Table per Concrete Type (TPC)
        modelbuilder.Entity<GiftCouponPayment>()
            .Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("GiftCouponPayment");
            });

        modelbuilder.Entity<ClubCardPayment>()
            .Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("ClubCardPayment");
            });
    }

    public DbSet<GiftCouponPayment> GiftCouponPayments { get; set; }
    public DbSet<ClubCardPayment> ClubCardPayments { get; set; }
    public DbSet<Payment> Payments { get; set; }
}

public abstract class PaymentComponent
{
    public int PaymentComponentID { get; set; }
    public int MyValue { get; set; }
    public abstract int GetEffectiveValue();
}

public partial class GiftCouponPayment : PaymentComponent
{
    public override int GetEffectiveValue()
    {
        if (MyValue < 2000)
        {
            return 0;
        }
        return MyValue;
    }
}

public partial class ClubCardPayment : PaymentComponent
{
    public override int GetEffectiveValue()
    {
        return MyValue;
    }
}

public partial class Payment
{
    public int PaymentID { get; set; }
    public List<PaymentComponent> PaymentComponents { get; set; }
    public DateTime PayedTime { get; set; }
}

Client:

    static void Main(string[] args)
    {
        Database.SetInitializer<NerdDinners>(new MyInitializer());
        string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";

        using (var db = new NerdDinners(connectionstring))
        {
            GiftCouponPayment giftCouponPayment = new GiftCouponPayment();
            giftCouponPayment.MyValue=250;
            
            ClubCardPayment clubCardPayment = new ClubCardPayment();
            clubCardPayment.MyValue = 5000;
                    
            List<PaymentComponent> comps = new List<PaymentComponent>();
            comps.Add(giftCouponPayment);
            comps.Add(clubCardPayment);

            var payment = new Payment { PaymentComponents = comps, PayedTime=DateTime.Now };
            db.Payments.Add(payment);

            int recordsAffected = db.SaveChanges();
        }
    }

您没有为 TPC / TPT 映射指定 ID 字段。即使使用继承,您也需要在不运行 TPH 映射时执行此操作。 (要注意的是,我也不确定MapInheritedProperties()call...这一般用于TPH...而不是TPT)

 //Fluent API - Table per Concrete Type (TPC)
 modelbuilder.Entity<GiftCouponPayment>()
      .HasKey(x => x.PaymentComponentID)
      .Map(m =>
      {
          m.MapInheritedProperties();
          m.ToTable("GiftCouponPayment");
      })
      .Property(x => x.PaymentComponentID)
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

这需要在具体类型的每个类映射上。如果是我,我会选择 TPH 映射,其中 GiftCoupon 以及其他继承映射,这样您最终会得到 1 个表,使用鉴别器列来表示整个对象树。

无论如何...您的基类中缺少的另一件事是:

public byte[] Version { get; set; }

以及相关的映射:

Property(x => x.Version).IsConcurrencyToken()

这允许乐观并发。

希望这对您有所帮助,如果您需要进一步的帮助或说明,请告诉我。

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

主键违规:使用 EF Code First 进行继承 的相关文章

  • 按成员序列化

    我已经实现了template
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit

随机推荐

  • mysql_query 仅返回 int/fload 数据库类型的字符串类型

    我正在尝试处理 MySQL 选择结果 我的问题是下面的示例代码仅返回一个包含所有值的数组string 甚至对于包含整数和浮点数的列也要键入 sth mysql query selectstr rows array while r mysql
  • Rcpparmadillo :将 fastLM 对象转换为“lm”类型

    首先感谢您提供这么好的包裹 我希望对 fastLM 的输出运行 anova 但是 anova 只接受 lm 类型的对象 有没有办法将 fastLM 对象转换为 lm 对象 谢谢 S 首先 fastLM 存在是为了提供比lm 使其更快的方法之
  • “你好,世界!”遇到了意想不到的困难

    我想学习 Clojure 我已经下载并设置了以下小工具 Clojure 1 6 0 来自官方网站 莱宁根2 4 3 来自 GitHub 的苹果酒 0 6 0 我已经成功了 现在我正在尝试打印消息 Hello World 同时从 Emacs
  • Google 日历 API - 创建活动时邀请电子邮件不会发送给与会者

    我想使用 google api 将事件添加到 google 日历 但活动创建后 邀请电子邮件不会发送到与会者电子邮件列表 这是我的代码
  • python 正则表达式仅匹配第一个实例

    我有一个 python 代码 我正在读取证书并仅匹配根证书 例如 我的证书如下 begin certificate CZImiZPyLGQBGRYFbG9jYWwxGjAYBgoJkiaJk IasdasdassZAEZFgp2aXJ0dW
  • Android:多个警报不起作用

    在我的应用程序中 我设置了两个闹钟 在 ToogleButton 上 我将使用以下代码将其设置为打开 case R id toggleButtonTwoMonth myPrefs this getSharedPreferences myPr
  • 如何在内核中放置微秒延迟?

    我想放置微秒延迟Linux kernel 哪些函数支持它 需要添加什么头文件 你最好读书Documentation timers timers howto txt在linux内核源代码中 简而言之 您可以使用msleep unsigned
  • 为什么PWA提倡添加到主屏幕但只是创建chrome快捷方式而不是安装为apk?

    我检查所有添加到主屏幕条件 我想我在我的 PWA 中提供了所有这些 当用户访问我的 PWA 迷你信息栏时 当用户单击 添加到主屏幕 时 仅将 PWA 的快捷方式添加到主屏幕 但未安装 PWA 不在应用程序列表中 并且深层链接不起作用 UPD
  • SlimDX/DirectX9/C# - 如何访问纹理中的像素数据

    这是我在 StackOverflow 上遇到的第一个问题 万岁 我可以诚实地说 我每天都使用 StackOverflow 来处理我的工作和个人编程谜题 99 9 的情况下 我实际上也在这里找到了我需要的答案 这太棒了 我当前的问题实际上让我
  • 图像处理/超轻OCR

    我有 55 000 个图像文件 JPG 和 TIFF 格式 它们是书中的图片 每个页面的结构是这样的 一些文字 水平线 a number 一些文字 水平线 另一个号码 一些文字 任何给定页面上可以有 0 到 4 条水平线 我需要找到水平线下
  • 将 ASPX 导出为 HTML

    我们正在构建一个 CMS 该网站将由用户在 aspx 页面中构建和管理 但我们希望创建一个 HTML 的静态网站 我们现在的做法是使用我找到的代码here重载 Aspx 页面中的 Render 方法并将 HTML 字符串写入文件 这对于单个
  • Mayavi 纹理覆盖整个表面

    我想做类似的事情 使用 python 和 Mayavi2 进行 3D 地形可视化 作为输入 我有一个图像 地图 其宽度和高度以像素为单位定义 对于此图像 地图 我获得了图像 地图所代表的表面 范围 的数字高程模型 范围由最小 最大经度和纬度
  • 在Python中设置函数签名

    假设我有一个通用函数f 我想要以编程方式创建一个函数f2其行为与f 但有一个定制的签名 更多详情 给定一个列表l和 字典d我希望能够 设置非关键字参数f2到字符串中l 设置关键字参数f2到按键d和默认值的值d IE 假设我们有 l x y
  • 如何添加Access-Control-Allow-Origin?

    当我调用我的 webservice 方法时 出现以下错误 Origin http localhost 4165 is not allowed by Access Control Allow Origin 当参考网络时 我得到了像 add 这
  • 如何检索通过 insert...select 插入的行的标识?

    我正在通过类似于此的查询插入记录 insert into tbl xyz select field1 from tbl abc 现在我想检索插入记录的新生成的 IDENTITY 值 如何以最少的锁定量和最大的可靠性来做到这一点 您可以使用以
  • 如何在 Ajax 调用期间用加载图像替换 TD 内的图像

    我有一个 HTML 表格 每个单元格中都有一个图像 后面跟着一些文本 像这样的事情 td img src image gif This is a test td 我必须运行 jQuery Ajax 调用 在此调用期间 我想将图像更改为我拥有
  • 文件输入为空,但 Request.Files 中显示空“文件”

    我有一个具有以下文件输入的视图
  • 为什么 scanf 不需要字符串的 & 符号并且在 printf (C 语言)中也能正常工作?

    我现在正在学习C语言中的字符串 如何使用 scanf 来获取字符串你可以这样做 scanf s str1 对于 printf 你可以做 printf The string is s n str1 我知道对于 scanf 来说 这是因为字符串
  • 如何同步两个具有相同结构和不同服务器的MySQL表

    我有两台ubuntu服务器 并安装了Mysql 4 0 ServerA和ServerB 我想将ServerA的mysql表同步到ServerB 将ServerATable复制到ServerBTable 保持ServerATable和Serv
  • 主键违规:使用 EF Code First 进行继承

    我有以下 EF 代码第一个代码 我收到以下异常 GiftCouponPayment 不包含标识列 表已在数据库中成功创建 然而 我怎样才能摆脱这个异常呢 另外 这个异常的原因是什么 注意 只要保留域模型 首先使用代码描述 并且可以查询数据