如何避免实体框架 4.3.1 中的重复插入

2023-12-13

我有一个使用代码优先方法创建的小模型 - 一个类City其中仅包含有关城市名称的信息。

public class City
{
    public City()
    {
        Posts = new List<Post>();
    }

    public City(string cityName)
    {
        Name = cityName;
    }

    public virtual ICollection<Post> Posts { get; private set; }
    public int Id { get; set; }
    public string Name { get; private set; }
}

A Post类表示邮政编码和城市参考的组合

public class Post
{
    public virtual City City { get; set; }        
    public int Id { get; set; }
    public string ZipCode { get; set; }        
}

两个实体都在上下文中定义了它们的集合作为它们的配置

public DbSet<City> Cities { get; set; }
public DbSet<Post> Posts { get; set; }

modelBuilder.Configurations.Add(new CityMap());
modelBuilder.Configurations.Add(new PostMap());


public class CityMap : EntityTypeConfiguration<City>
{
    public CityMap()
    {
        // Primary Key
        HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        ToTable("City");
        Property(t => t.Id).HasColumnName("Id");
        Property(t => t.Name).HasColumnName("Name");
    }
}

public class PostMap : EntityTypeConfiguration<Post>
{
    public PostMap()
    {
        // Primary Key
        HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        ToTable("Post");
        Property(t => t.Id).HasColumnName("Id");            
        Property(t => t.ZipCode).HasColumnName("ZipCode");

        // Relationships
        HasRequired(t => t.City)
        .WithMany(t => t.Posts)
        .Map(map=>map.MapKey("CityId"));
    }
}

我创建了用于使用静态方法操作这些对象的类,这些静态方法获取或创建对象并将它们返回给调用者。

private static City GetCity(string cityName)
{
        City city;

        using (var db = new DbContext())
        {
            city = db.Cities.SingleOrDefault(c => c.Name == cityName);

            if (city == null)
            {
                city = new City(cityName);
                db.Cities.Add(city);
                db.SaveChanges();                    
            }
        }

        return city;
    }

    private static Post GetPost(string zipCode, string cityName)
    {
        Post post;

        City city = GetCity(cityName);

        using (var db = new DbContext())
        {      
            post = db.Posts.SingleOrDefault(p => p.City.Id == city.Id && p.ZipCode == zipCode);
            if (post == null)
            {
                post = new Post { City = city, ZipCode = zipCode };

                // State of city is unchanged
                db.Posts.Add(post);

                // State of city is Added
                db.SaveChanges();
            }
        }

        return post;
    }

想象一下,我调用方法

GetPost("11000","Prague");

method GetCity启动,如果不存在,方法创建一个city然后调用SaveChanges() method.

如果我设置返回city实体到新Post例如,实体框架为相同的内容生成第二个插入city.

我怎样才能避免这种行为?我只想插入新的post引用的实体city在上一步中创建或加载。


您需要设置State当您将其附加到未更改的城市时

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

如何避免实体框架 4.3.1 中的重复插入 的相关文章

  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 包含 ASP.Net Identity 2.0 UserManager.Users.ToListAsync 和 UserManager.FindByIdAsync 上的属性

    我正在尝试实现 Asp Net Identity 2 0 到目前为止 在以下人员的帮助下我做得很好这个博客 http typecastexception com post 2014 06 22 ASPNET Identity 20 Cust
  • 将平面集合转换为层次集合的递归方法?

    我已经被这个问题困扰了几天 希望得到一些想法或帮助解决它 我有一个对象集合 public class Hierarchy public Hierarchy string iD string name int level string par
  • 实体框架 - 相关的 ICollection 被具体化为 HashSet

    我在我的项目中使用实体框架 POCO 代理 延迟加载 今天我很惊讶地看到这个班级Transaction有其相关合集Rows物化为HashSet 代替EntityCollection 我需要EntityCollection用于跟踪集合中的更改
  • 实体框架:无需映射即可调用存储过程

    有没有一种方法可以在不使用实体框架函数映射的情况下使用存储过程 这很好 但是当向存储过程添加任何更改时 这完全是垃圾 我知道您可以刷新存储过程映射 但事实并非如此高效的 大多数时候 当您更新映射时 它不会检测到更改 这是非常烦人的 到目前为
  • 包管理器控制台中缺少文件错误

    我们的开发团队的一些成员在打开包管理器控制台时开始看到以下错误 它完全阻止我们运行实体框架命令 我们已经检查过并且提到的文件确实存在 GetEvent types ps1xml Diagnostics Format ps1xml Diagn
  • 下载 .NET 3.5 的实体框架

    哪个版本的实体框架 EF 我可以用在 NET 3 5我可以在哪里下载这个旧版本 对于 Net 3 5 您可以使用 EF v1 您是否尝试从以下位置下载 Microsoft NET Framework 3 5 Service Pack 1 h
  • 用于开发和生产的不同种子

    根据构建配置 调试 发布 使用实体框架 6 以不同方式为数据库设定种子的推荐方法是什么 现在我正在使用 MigrateDatabaseToLatestVersion 初始值设定项 在开发过程中 我喜欢在数据库中使用虚假数据进行测试 因此 我
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 从 SQL Server 表中获取随机行数

    我正在尝试使用快速方法从一个大表 超过 100 万行 中获取 5 个随机行数 到目前为止 我已经使用这些 SQL 查询进行了测试 Method 1 Select top 5 customer id customer name from Cu
  • ASP.NET MVC5:想要使用模型绑定更新集合中的多个项目

    所以我有一个用户对象的集合 它应该是可批量编辑的 同时编辑许多用户 我使用实体框架将用户输入保存到数据库中 控制器方法从表单获取的集合为 null 为什么 另外 BindAttribute 是否可以像我的代码中那样与集合一起使用 View
  • EF 6 从没有导航属性的其他表中选择

    我有一个小问题需要帮助解决 我有以下情况 例如 我想选择所有养狗的学生 我有 2 张桌子 students id name petid pet id name 但是它们之间没有指定的外键 没有导航属性 虽然我有但没有指定它并且我不想要我的情
  • 如何自动将实体模型更改部署到数据库?

    目前我使用 Visual Studio 数据库项目 因此我可以一键将更改部署到数据库并将数据保留在数据库中 现在我希望能够在实体框架中创建模型并一键部署 所以我得到了从实体框架创建数据库的sql脚本 我可以运行此脚本来创建数据库 但我想将数
  • 重构:从自定义数据访问层切换到实体框架

    我是一名 NET 开发人员 作为重构项目的一部分 我有几个问题 我们的软件当前使用 Active Record 模式 数据对象和业务对象之间的一对一映射 不好的是业务对象继承自数据对象 导致层之间的高度耦合 我们的目标是从自定义数据访问层
  • 在删除属性之前,必须删除或重新定义所有包含外键的内容 - EF Core

    使用实体框架核心添加外键后尝试添加迁移时出现上述错误 我正在添加FK public class ApplicantDetail Key public int Id get set ForeignKey GrantProgramFK publ
  • 实体框架:为什么实体类的集合类型需要在默认构造函数中实例化?

    我正在使用 Visual Studio 构建代码优先模型北风自动数据库 我有一些疑问 我发现如果实体类有一个集合 那么该集合总是在默认构造函数中实例化 为什么我们需要这样做 The ICollection
  • Entity Framework Core - 在 Queryable 中使用扩展方法

    我有以下查询 db Users AsQueryable Where u gt u Id userResolver LoggedUserId u Packages Where p gt p StatusId int PackageStatus
  • 如何消除错误 3002?

    假设我在 SQL Server 2008 中有以下表定义 CREATE TABLE Person PersonId INT IDENTITY NOT NULL PRIMARY KEY Name VARCHAR 50 NOT NULL Man
  • 删除所有出现的重复行

    如果我想删除某些字段重复的行 那么我使用 sort u k n n 但这仍然发生一件事 如果我想删除所有出现的重复项 有没有快速的 bash 或 awk 方法可以做到这一点 例如我有 1 apple 30 2 banana 21 3 app
  • 实体框架 4 将订单链接到拥有 10,000 个订单的客户非常慢

    这个把我难住了 我有一个客户和订单实体 客户可以有多个订单 当我创建新订单并设置 Customer 属性 Order Customer customer 时 如果客户有 10 000 个订单 则会有很长的延迟 20 秒 在添加这个新订单之前

随机推荐

  • 更新/提取 Mongodb/Mongoose 子文档数组中包含的数组中的值

    我在 mongoDB 集合中有一个文档 如下所示 id 5d4721e0b904e825755eaf89 sellers id 5d5eeaf7867a4e1e9a1219e6 bizs id 6a5eeaf7867a4e124a1219a
  • C 语言有 setfill() 替代方案吗?

    In C int main cout lt lt setfill lt lt setw 10 lt lt 5 lt lt endl return 0 Outputs 5 有没有setfill C 的替代品 或者如何在 C 中执行此操作而无需
  • Windows 窗体应用程序,带有窗体的自动缩放控件

    我是新手 设计一个可以调整大小的表单 并且我希望我的文本框 标签和按钮随表单调整大小 有人可以告诉我该怎么做吗 这取决于您需要的布局类型 您必须执行的 基本工具 具有以下属性 Anchor and Dock Anchor 使用 Anchor
  • 在运行时生成 HTML 文件并作为电子邮件附件发送

    我有一个项目要求 我们需要将 HTML 格式的日志表附加到发送给用户的电子邮件中 我不希望日志表成为正文的一部分 我不想使用 HTMLTextWriter 或 StringBuilder 因为日志表非常复杂 是否有另一种我没有提到的方法或可
  • PHP 从 XML 中检索数据

    我第一次尝试从地图应用程序的 XML 检索数据失败了 这是 XML Feed 的一部分
  • 使用productElements将元组转换为HList

    我正在使用 Shapeless 2 2 5 我尝试使用下面的代码将元组转换为 HList import shapeless import syntax std product 23 foo 2 0 true productElements
  • JavaScript、浏览器、窗口关闭 - 发送 AJAX 请求或在窗口关闭时运行脚本

    我试图找出用户何时离开指定页面 找出他何时使用页面内的链接导航离开是没有问题的 但我需要标记一些内容 例如他关闭窗口或键入另一个 URL 并按 Enter 键时 第二个不太重要 但第一个很重要 所以问题是 我怎样才能看到用户何时关闭我的页面
  • 如何以编程方式设置 iPhone 壁纸

    我正在开发一个应用程序 其中我必须将图像设置为iPhone壁纸 滑动解锁 屏幕上的背景图像 我们有这方面的 API 参考吗 请帮忙 提前致谢 帕尔梅斯瓦尔 目前 您唯一可以做的就是将图像保存到相机胶卷中 并为用户提供有关如何使用新图像更改壁
  • 在trigger_error之前的'@'(沉默运算符,at符号)的目的是什么?

    我在许多 Symfony 包 以及其他代码 中看到了这一行 trigger error The class is deprecated E USER DEPRECATED 根据文档 at 运算符用于消除错误 http php net man
  • 创建 atoi 函数

    我正在尝试创建自己的 atoi 函数 通过以下代码 我得到的返回值为 0 无论我更改函数中的数字变量 我都会得到返回值 关于修改代码有什么建议吗 my atoi function int atoi me char numstring int
  • HttpClient 中使用 wait 的异步调用永远不会返回

    我正在从基于 xaml 的内部拨打电话 C Win8 CP上的metro应用 此调用只需访问 Web 服务并返回 JSON 数据 HttpMessageHandler handler new HttpClientHandler HttpCl
  • 阻止直接 URL 访问图像文件?

    我想阻止人们通过在浏览器地址栏中输入 URL 来获取我网站的图像 同时允许他们在访问网页时查看图像 我尝试了以下 htaccess 代码 RewriteEngine on RewriteCond HTTP REFERER http www
  • JSF 2.0 简单登录页面

    我需要限制对应用程序的一部分的访问 为了访问该部分 用户需要登录 我的数据库中有一个名为 User 的表 其中包含用户名和散列密码以及由两个输入和一个提交组成的登录表单 但是 我不知道应该使用哪些类 数学来登录用户 我假设 jsf 中支持此
  • 保持mysql连接的正确方法[重复]

    这个问题在这里已经有答案了 我有一个 24 7 运行的应用程序 它使用 mysql 它的不同功能都使用mysql 实现它的一种方法是在应用程序中创建一个全局 mysql 实例 如下所示 self db MySQLdb connect hos
  • 导出 Room 数据库并附加到电子邮件 Android Kotlin

    我有以下代码用于导出房间数据库 然后将其附加到电子邮件中 目前 用户首先必须选择要保存数据的位置 然后才能附加数据 有没有一种方法可以做到这一点 而不必首先询问用户在哪里保存数据库 这是我的代码 fun exportDatabase val
  • 如何在 iis 服务器上启用 mod_rewrite

    我发现我的服务器上没有启用 mod rewrite 功能 SERVER SERVER SOFTWARE Microsoft IIS 7 0 架构 x86 我如何启用 mod rewrite 有人可以帮助我吗 对我有用的答案是安装微软 URL
  • 在 MKMapView 中设置当前位置图标下侧

    我想在地图下方显示我当前的位置 iOS 6 和 iOS 7 如下面的屏幕截图所示 用户可以看到进一步的视图 带有谷歌地图的谷歌默认应用程序 Right now the cursor that shows center in the view
  • 当服务器处于Unix套接字时如何连接到数据库?

    我与数据库 phpmyadmin 的连接有问题 这只是因为我的服务器位于 UNIX 套接字中 我不知道如何连接到它 我站在窗户上 如果我的服务器采用 TCP IP 下面的代码可以正常工作 My code
  • JQuery:ajax 请求时出现“未捕获类型错误:非法调用”

    我正在使用这个 AJAX 函数将我的表单发布到特定的 URL 它正在获取所需的 URL 并进行处理 但是当它返回结果时 它会给出错误
  • 如何避免实体框架 4.3.1 中的重复插入

    我有一个使用代码优先方法创建的小模型 一个类City其中仅包含有关城市名称的信息 public class City public City Posts new List