【发布时间】:2017-05-30 20:26:21
【问题描述】:
我正在构建一个 Web API 并且有两个模型:任务和功能:
public class Feature
{
[Key]
public long FeatureId { get; set; }
public string Analyst_comment { get; set; }
public virtual ICollection<User_Task> Tasks { get; set; }
public Feature()
{
}
}
public class User_Task
{
[Key]
public long TaskId { get; set; }
public string What { get; set; }
[ForeignKey("FeatureId")]
public long? FeatureId { get; set; }
public User_Task()
{
}
}
我首先创建任务,然后创建一个结合了其中几个任务的功能。任务创建成功,但是在使用现有任务创建功能时,我的控制器会抛出错误,指出任务已存在:
我的 FeatureController 有以下方法:
//Create
[HttpPost]
public IActionResult Create([FromBody] Feature item)
{
if (item == null)
{
return BadRequest();
}
** It basically expects that I am creating a Feature with brand new tasks, so I guess I will need some logic here to tell EF Core that incoming tasks with this feature already exist **
_featureRepository.Add(item);
return CreatedAtRoute("GetFeature", new { id = item.FeatureId }, item);
}
如何告诉 EF 核心,传入的功能具有已经存在的任务,它只需要更新引用而不是创建新的?
我的背景:
public class WebAPIDataContext : DbContext
{
public WebAPIDataContext(DbContextOptions<WebAPIDataContext> options)
: base(options)
{
}
public DbSet<User_Task> User_Tasks { get; set; }
public DbSet<Feature> Features { get; set; }
}
和回购:
public void Add(Feature item)
{
_context.Features.Add(item);
_context.SaveChanges();
}
【问题讨论】:
-
您是否已经尝试附加它?不知道您的存储库实现如何以及它返回什么,因此您可以在存储库中执行附件(在 AddOrUpdate 方法中?)。
context.Attach(item)应该附加一个分离的项目。原因是 EF Core 基于 changetracker 跟踪项目。当一个项目不在跟踪器中并且您调用“.Add”时,它会将其视为插入。当您附加它时,它将查看实体是否存在,如果存在,则将其加载到跟踪器中,然后跟踪更改并执行更新 -
我已经用上下文和 repo 类方法更新了我的问题。也许现在你能准确指出我能做什么吗?
-
_context.Attach(item)之前(或代替)context.Features.Add(item)解决了吗? -
另见docs ASP.NET Core + EF Core 的示例和推荐用法
-
把它放在 Add() 之前给出算术异常,把它放在 Add() 之后也会抛出一个异常。当我使用而不是 Add() 时,没有错误,我得到了响应(得到 featureId=0 的功能),但在数据库中没有创建任何内容
标签: asp.net-core entity-framework-core