我有一个问题,实体框架(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搜索中看到此问题。
答案 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 AnyDTO
在AnyDAL
上映射_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
很好地描述了这一点