EF 一对一更新失败

2023-12-25

我在 EF6 中定义了一对一关系,适用于插入。不幸的是,当我尝试使用断开连接的记录进行更新时,我收到错误。详细信息如下:

.NET 来源:

namespace EF_ConsoleApp_Test
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int? accountId;
            int? customerId;

            using (var db = new MainContext())
            {
                var account = new Account
                {
                    AccountNumber = "1234",
                    Customer = new Customer {FirstName = "John"}
                };

                db.Accounts.Add(account);
                db.SaveChanges();

                accountId = account.Id;
                customerId = account.Customer.Id;
            }

            using (var db = new MainContext())
            {
                // disconnected record
                var account = new Account()
                {
                    Id = accountId,
                    AccountNumber = "9876",
                    Customer = new Customer() {Id = customerId}
                };

                db.Accounts.Add(account);
                db.Entry(account).State = EntityState.Modified;
                db.Entry(account.Customer).State = EntityState.Unchanged;

                db.SaveChanges(); // Error occurs here
            }
        }

        [Serializable]
        [Table("CUSTOMERS")]
        public class Customer
        {
            [Key] [Column("CUSTOMER_ID")] public int? Id { get; set; }

            [Required]
            [Column("FIRST_NAME")]
            [StringLength(45)]
            public string FirstName { get; set; }

            public virtual Account Account { get; set; }

            public Customer() { }
        }

        [Serializable]
        [Table("ACCOUNTS")]
        public class Account
        {
            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            [Column("ACCOUNT_ID")]
            public int? Id { get; set; }

            [Required]
            [Column("ACCOUNT_NUMBER")]
            [Display(Name = "Account Number")]
            [StringLength(16)]
            public string AccountNumber { get; set; }

            public virtual Customer Customer { get; set; }

            /// <summary>
            /// Default Constructor
            /// </summary>
            public Account() { }
        }

        internal class MainContext : DbContext
        {
            internal MainContext() : base("name=ACHRE.Context")
            {
                Database.SetInitializer<MainContext>(null);
            }

            public virtual DbSet<Account> Accounts { get; set; }

            public virtual DbSet<Customer> Customers { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                // Configure FK
                modelBuilder.Entity<Customer>()
                    .HasRequired(c => c.Account)
                    .WithRequiredPrincipal(a => a.Customer)
                    .Map(m => m.MapKey("CUSTOMER_ID"));

                base.OnModelCreating(modelBuilder);
            }
        }
    }
}

数据库表创建语句:

CREATE TABLE [dbo].[CUSTOMERS](
    [CUSTOMER_ID] [INT] IDENTITY(1,1) NOT NULL,
    [FIRST_NAME] [varchar](45) NOT NULL,
 CONSTRAINT [PK_CUSTOMERS] PRIMARY KEY CLUSTERED 
(
    [CUSTOMER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ACCOUNTS](
    [ACCOUNT_ID] [INT] IDENTITY(1,1) NOT NULL,
    [CUSTOMER_ID] [int] NOT NULL,
    [ACCOUNT_NUMBER] [varchar](16) NOT NULL,
 CONSTRAINT [PK_ACCOUNTS] PRIMARY KEY CLUSTERED 
(
    [ACCOUNT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[ACCOUNTS]  WITH CHECK ADD  CONSTRAINT [FK_ACCOUNTS_CUSTOMERS] FOREIGN KEY([CUSTOMER_ID])
REFERENCES [dbo].[CUSTOMERS] ([CUSTOMER_ID])
GO

Error:

来自“Customer_Account”关联集的关系位于 “添加”状态。给定多重性约束,相应的 “Customer_Account_Target”也必须处于“已添加”状态。

我需要更新什么才能使其正常工作?

Notes

  • 这与question https://stackoverflow.com/questions/50011305/entity-framework-one-to-one-referentialconstraint-is-mapped-to-a-store-gener我之前问过,这与插入有关。插入已解决,但在删除外键时引入了此问题。
  • 使用 EF 6.2 和 .NET 4.7.1。

这是因为您要再次添加实体。您需要首先通过调用附加对象db.Accounts.Attach(account);.

或者更好的方法是首先根据 Id 获取,然后修改所需的字段,如下所示:

       using (var db = new MainContext())
        {
            var account =  db.Accounts.SingleOrDefault(x => x.id == accountId);
            account.AccountNumber = "9876"
            db.SaveChanges();
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF 一对一更新失败 的相关文章

随机推荐

  • Chrome 扩展中的跨源 XMLHttpRequest

    根据 chrome 扩展 API 如果设置了权限 则应允许使用 XMLHttpRequest 对象进行跨源调用 只要扩展程序首先请求跨源权限 就可以与其源之外的远程服务器进行通信 我正在密切关注谷歌教程 http code google c
  • 如何 dplyr 按列索引重命名列?

    以下代码重命名数据集中的第一列 require dplyr mtcars gt setNames c RenamedColumn names 2 length names 期望的结果 RenamedColumn cyl disp hp dr
  • jsPlumb:如何选择特定连接器

    我似乎不知道如何选择特定的 jsPlumb 连接器 我知道我可以选择与源或目标相关的所有连接器 但通常我会在同一源和目标之间有多个连接器 因此在这种情况下我看不到能够选择特定连接器的方法 我的具体用例如下 如果用户单击连接器 则会出现一个对
  • 无法重新启动 Spring 批处理作业

    我有一个 Spring Batch 作业 用于读取 转换和写入 Oracle 数据库 我通过 CommandLineJobRunner 实用程序运行该作业 使用 fat jar 使用 Maven Shade 插件生成的依赖项 该作业随后由于
  • 有没有办法在 JavaScript 中清除对象?

    有没有办法清除 Javascript 中的对象 具体来说 如果一个对象有多个成员变量 是否有一种简单的方法来重置每个值 function exampleObject this valueA A this valueB B this myAr
  • SQL——在 select 语句中分配位变量

    例如 declare bitHaveRows bit select bitHaveRows count from table where predicate 我可以在这一行调用任何函数吗 select bitHaveRows count 如
  • 如何在请求写入代理 Netty 服务器中的 outboundChannel 时在同一处理程序中获取响应 byteBuf

    我正在实现 netty 代理服务器 如下所示 一个http请求进来 如果本地缓存有数据 则写入channel并flush 如果没有 则从远程服务器获取数据 将其添加到缓存并刷新 我在与写入客户端的处理程序相同的处理程序中从响应中提取 byt
  • 如何查找Javascript语法错误? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在编写一段 JavaScript 代码 并在语法中犯了很多愚蠢的错误 但是找到错误所在行的唯一方法是开始注释掉我刚刚编写的代码部分
  • 搜索 R-Studio 中所有打开的文件

    R Studio 中的普通搜索功能 ctrl f 仅搜索当前选定的文件 有没有办法搜索所有打开的文件 Tom 查看以下文档 http www rstudio com ide docs using navigation http www rs
  • 我需要在共享内存对象上使用 shm_unlink 吗?

    我编写了一个连续运行的服务器 GNU C Linux 偶尔执行小型独立程序来完成工作 为了有效地将数据获取到工作程序 服务器创建并映射一个共享内存对象 为了清楚起见 缩写了代码 int fd shm open shm file O CREA
  • 如何在MaterialDesignInXamlToolkit中添加个人图标?

    Material Design Icons 项目包含大量图标 但对于非英语国家来说还不够 那么如何在不修改源代码的情况下在个人项目中添加另一个包图标呢 正如 mm8所说 是的 这只是一条路径 但是 是的 您可以构建自己的 PackIcon
  • Android Afreechart - 更改点形状、线条粗细和颜色

    我正在尝试在我的应用程序中更改折线图点的形状 我在用afreechart s TimeSeriesChart 我想让这条线在粗细 颜色和点形状方面变得更漂亮 哪里可以改代码 将使用哪种方法 我现在拥有的 source googlecode
  • 通过 ckeditor 上传的 django+heroku+S3 图片在创建帖子一段时间后被删除

    我已经在heroku中部署了我的django应用程序 postgresql作为数据库并用于存储我使用亚马逊S3存储的图像 我面临的问题是 用于创建我使用过的博客文章 ckeditor 因此用户可以输入图像以及内容文本来创建帖子 创建帖子后
  • 由于“找不到符号类 X”错误,无法在 Intellij Idea 中编译 java 类

    我在项目中从头开始创建了新的 Java 模块 在模块创建向导中选择了 创建 src 文件夹 源文件夹中有一个 com 包 其中包含两个公共类 例如 A 和 B A类实例化B类 IDE 不显示错误 并且当光标位于 A 类源内的类名上时 按 c
  • 模拟在默认系统相机应用程序中拍照

    我正在制作 Android 语音助手应用程序 在后台运行服务以识别语音命令 当用户说 自拍 这个词时 我想在默认系统相机应用程序中拍照 我已经知道如何使用语音命令 但问题是我无法让相机应用程序拍照 我尝试了一些方法但没有帮助 第一次我尝试模
  • 如何在页面刷新后保持登录状态?

    我正在使用 React 和 Node 开发一个全栈应用程序 以下是主屏幕 用户登录后 用户名会显示在导航栏中 服务器的响应 包括 JWT 会保存在本地存储中 如下图所示 现在 当我刷新页面时 用户已注销 这种情况不应该发生 因为我使用 ax
  • 如何在java和xml中传递自定义组件参数

    在 android 中创建自定义组件时 经常会被问到如何创建 attrs 属性并将其传递给构造函数 通常建议在 java 中创建组件时只需使用默认构造函数 即 new MyComponent context 而不是尝试创建一个 attrs
  • Font Awesome 5 Whatsapp 图标 CSS 样式

    我尝试使用下面的代码使用 font Awesome 5 呈现 Whatsapp 图标 i style background color 25d366 color white class fab fa whatsapp i 但它看起来像这样
  • 在Scheme(Fluent)中运行(do ...)内的代码与循环外的执行方式不同

    我的续集上一个问题 https stackoverflow com q 58906949 12388640 我正在使用 ANSYS Fluent 程序进行 CFD 模拟 该程序允许使用所谓的日志文件对模拟设置进行部分自动化 我刚刚知道该日志
  • EF 一对一更新失败

    我在 EF6 中定义了一对一关系 适用于插入 不幸的是 当我尝试使用断开连接的记录进行更新时 我收到错误 详细信息如下 NET 来源 namespace EF ConsoleApp Test public class Program pub