实体框架在更新时删除对象

时间:2017-12-06 00:52:29

标签: automapper entity-framework-core

我有一个问题,实体框架(Core)在更新时删除了一个对象。我认为这与Automapper有关(将DTO资源映射到对象)。我有其他对象映射与此对象完全相同的方式和更新工作正常。

public async Task<IActionResult> UpdateFeedback(Guid Id, [FromBody] FeedbackResource feedbackResource)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);
    //removing or else get a tracking error with EF
    feedbackResource.FeedbackType = null;
    var feedback = await feedbackRepository.GetFeedback(Id);

    if (feedback == null)
        return NotFound();

    //if I use this line to map, EF will delete the object upon save.  

    mapper.Map<FeedbackResource, Feedback>(feedbackResource, feedback);

    // if I map manually, i get no error
    //feedback.Title = feedbackResource.Title;
    //feedback.Details = feedbackResource.Details;
    //feedback.IsGoodFeedback = feedbackResource.IsGoodFeedback;
    //feedback.IsReviewed = feedbackResource.IsReviewed;
    //feedback.FeedbackTypeId = feedbackResource.FeedbackTypeId;

    //if(feedbackResource.IsReviewed){
    //    feedback.ReviewDate = DateTime.Now;
    //    feedback.ReviewedBy = UserId;
    //} else {
    //    feedback.ReviewDate = null;
    //    feedback.ReviewedBy = null;
    //}

    await uow.CompleteAsync();

    return Accepted(feedback); 
}

我不知道该在此处进行问题排查,并且无法在任何Google搜索中看到此问题。

3 个答案:

答案 0 :(得分:0)

我遇到了类似的情况(如核心1.1)。我会假设你的问题与我的问题类似。

Also a similar problem is described here

我有以下型号:

1)ApplicatonUser - EF的标准用户

2)AnyDAL - DB中任何具有用户链接

的类
 public class AnyDAL
 {
    public long Id { get; set; }

    public long UserId { get; set; }
    public ApplicationUser User { get; set; }
}

3)AnyDTO - 来自浏览器端的模型。就像你的[FromBody] FeedbackResource feedbackResource

一样
public class AnyDTO
{
    public long Id { get; set; }

    public long UserId { get; set; }

    /// It is root of all evil. See below.
    /// And yes, it is bad practice.
    public ApplicationUser User { get; set; }
}

情景:

1)从数据库中获取AnyDAL;

2)使用AutoMapper AnyDTOAnyDAL上映射_mapper.Map(DTO, DAL);

3)SaveChanges()

在一个案例中,SaveChanges()会导致删除,而另一种则会导致更新。

我们应该知道的是:在我的情况下,反序列化后,属性AnyDTO.User始终为null

删除和更新之间的选择取决于映射前的属性AnyDAL.User的值:

1)AnyDAL.User为空 - 我们得到更新。

2)AnyDAL.User不为空 - 我们得到删除。

换句话说。如果属性AnyDAL.User从某个值更改为null - 将删除实体。尽管AnyDAL.UserId保持不变。

有两种方法可以解决它:

1)从User;

删除属性AnyDTO

2)财产AnyDTO.User应始终具有价值。

答案 1 :(得分:0)

这有点旧,但是我在EF Core 2.2中遇到了同样的问题,并且基于此 EntityFrameworkCore在3.0中仍然是一个问题

问题似乎是导航属性为null导致实体被删除。

我能够通过配置延迟加载来解决

安装此软件包

Microsoft.EntityFrameworkCore.Proxies

在配置中启用延迟加载

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLazyLoadingProxies();

答案 2 :(得分:0)

对我来说,这个问题最终是由 automapper 和 EntityFramework 之间的交互引起的。 Automapper creating new instance rather than map properties

很好地描述了这一点