EF Core 更新无法跟踪实体类型“广告”的实例

爱德华

我尝试为 Asp.net Core DBContext 实现 XUnit 测试,但出现以下错误。

消息:System.InvalidOperationException:无法跟踪实体类型“Ads”的实例,因为已在跟踪具有相同键的此类型的另一个实例。添加新实体时,对于大多数键类型,如果未设置键(即,如果键属性为其类型分配了默认值),将创建一个唯一的临时键值。如果您为新实体显式设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突。附加现有实体时,请确保只有一个具有给定键值的实体实例附加到上下文。

这是我当前的代码:

    public class AdsServiceTest
{
    private readonly DbContextOptions<SensingSiteDbContext> _options;
    private readonly SensingSiteDbContext _context;
    private readonly AdsService _AdsService;
    public AdsServiceTest()
    {
        //initialize db options
        _options = new DbContextOptionsBuilder<SensingSiteDbContext>()
            .UseInMemoryDatabase()
            .Options;
        //get service
        _context = new SensingSiteDbContext(_options);
            //initialize dbcontext
            List<Ads> listAds = new List<Ads>() {
                new Ads(){  Id=1,AdsName="Ads1", Deleted=false},
                new Ads(){  Id=2,AdsName="Ads1", Deleted=false},
                new Ads(){  Id=3,AdsName="Ads1", Deleted=false}
            };
         _context.Advertisements.AddRange(listAds);
            //context.Advertisements
            BaseLib.SSDbContext<Ads, AdsService> ssDbContent = new BaseLib.SSDbContext<Ads, AdsService>(_context);
            _AdsService = ssDbContent.GetService((x, y) => new AdsService(x, y));

    }
    [Theory]
    [InlineData(1)]
    public void FindById(int id)
    {
        Ads adsResult = _AdsService.FindById(id);
        Ads adsTarget = _context.Advertisements.Find(adsResult.Id);
        Assert.True(adsTarget.Equals(adsResult));
    }
    //Failed by error System.InvalidOperationException : The instance of entity type 'Ads' cannot be tracked because another instance of this type with the same key is already being tracked
    [Fact]
    public void Update()
    {
        Ads adsResult = new Ads() { Id = 1, AdsName = "UpdateAds1" };
        _AdsService.UpdateAds(adsResult);
        Ads adsTarget = _context.Advertisements.Find(adsResult.Id);
        Assert.True(adsTarget.Equals(adsResult));
    }
}

Find没有问题,但更新失败。实现 AdsService 以调用 SensingSiteDbContext。似乎我需要为 SensingSiteDbContext 使用范围生存期。但是,我不知道如何实现它。
我已更改 ObjectState 以进行更新。

        public virtual void Update(TEntity entity)
    {
        entity.ObjectState = ObjectState.Modified;
        _dbSet.Update(entity);            
        _context.SyncObjectState(entity);
    }

任何帮助,将不胜感激。

斯泰罗拉

您正在创建new自己的实体,何时,您应该从上下文中获取您已经添加的实体:

Ads adsResult = new Ads() { Id = 1, AdsName = "UpdateAds1" };
_AdsService.UpdateAds(adsResult);

使用此代码,实体框架会说:“嘿,我已经有一个带有该键的实体(检查您的构造函数,您正在使用相同的 Id 放入一个实体),但是这个对象;我不知道该怎么做用它(因为它来自外面,钥匙已经存在)”。

您可以将其更改为您在之前的测试中所做的事情:

Ads adsResult = _AdsService.FindById(id);
//do your changing here
_AdsService.UpdateAds(adsResult);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF7迁移-实体类型“”对应的CLR类型不可实例化

来自分类Dev

EF Core 3 Casting无法翻译

来自分类Dev

EF Core:更新实体而不先查询

来自分类Dev

EF Core 3 Linq无法翻译

来自分类Dev

Ef Core 3实体类型XOrder不能映射到表,因为它是从Order派生的。只能将基本实体类型映射到表

来自分类Dev

EF Core:更新对象图重复子实体

来自分类Dev

EF Core抛出“'this'类型不能是接口本身”。

来自分类Dev

EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

来自分类Dev

PredicateBuilder无法在EF Core上运行

来自分类Dev

EF Core配置复杂类型

来自分类Dev

只读表/实体EF Core 3.0

来自分类Dev

EF Core 3:无法将CLR属性“ Number”添加到实体类型“ CHSIMTBase”,因为它是在CLR类型“合同”上声明的

来自分类Dev

具有Automapper的EF Core引发异常“无法跟踪实体类型”

来自分类Dev

EF Core>删除实体(软删除)>实体状态保持不变

来自分类Dev

在EF Core中添加或更新实体

来自分类Dev

进行EF Core迁移(SmartEnum)时,“找不到适合实体类型的构造函数”

来自分类Dev

EF Core不必要地跟踪子对象

来自分类Dev

关于EF Core中的“自有”类型

来自分类Dev

EF Core 5.0如何使用一个通用存储库管理多个实体类

来自分类Dev

EF Core连接结果的通用类型类

来自分类Dev

无法使用EF Core 1.1创建迁移

来自分类Dev

无法使用 EF Core 迁移

来自分类Dev

EF Core 访问嵌套嵌套实体

来自分类Dev

EF Core - 实体映射配置

来自分类Dev

EF Core - 插入然后更新条目

来自分类Dev

更新 ContextModelSnapshot EF Core

来自分类Dev

ASP.NET Core - 无法跟踪实体类型的实例

来自分类Dev

无法使用 EF Core 在 ASP.NET Core 中创建相关实体

来自分类Dev

EF Core 是否可以在非最高投影中跟踪实体?

Related 相关文章

  1. 1

    EF7迁移-实体类型“”对应的CLR类型不可实例化

  2. 2

    EF Core 3 Casting无法翻译

  3. 3

    EF Core:更新实体而不先查询

  4. 4

    EF Core 3 Linq无法翻译

  5. 5

    Ef Core 3实体类型XOrder不能映射到表,因为它是从Order派生的。只能将基本实体类型映射到表

  6. 6

    EF Core:更新对象图重复子实体

  7. 7

    EF Core抛出“'this'类型不能是接口本身”。

  8. 8

    EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

  9. 9

    PredicateBuilder无法在EF Core上运行

  10. 10

    EF Core配置复杂类型

  11. 11

    只读表/实体EF Core 3.0

  12. 12

    EF Core 3:无法将CLR属性“ Number”添加到实体类型“ CHSIMTBase”,因为它是在CLR类型“合同”上声明的

  13. 13

    具有Automapper的EF Core引发异常“无法跟踪实体类型”

  14. 14

    EF Core>删除实体(软删除)>实体状态保持不变

  15. 15

    在EF Core中添加或更新实体

  16. 16

    进行EF Core迁移(SmartEnum)时,“找不到适合实体类型的构造函数”

  17. 17

    EF Core不必要地跟踪子对象

  18. 18

    关于EF Core中的“自有”类型

  19. 19

    EF Core 5.0如何使用一个通用存储库管理多个实体类

  20. 20

    EF Core连接结果的通用类型类

  21. 21

    无法使用EF Core 1.1创建迁移

  22. 22

    无法使用 EF Core 迁移

  23. 23

    EF Core 访问嵌套嵌套实体

  24. 24

    EF Core - 实体映射配置

  25. 25

    EF Core - 插入然后更新条目

  26. 26

    更新 ContextModelSnapshot EF Core

  27. 27

    ASP.NET Core - 无法跟踪实体类型的实例

  28. 28

    无法使用 EF Core 在 ASP.NET Core 中创建相关实体

  29. 29

    EF Core 是否可以在非最高投影中跟踪实体?

热门标签

归档