我正在使用ASP.NET Web API和带有MySQL的Entity Framework 6构建REST API。
通过前端[Angular.js]网络应用,用户可以POST
API的实体来更新它,但我不确定我应该如何处理可能已经对其进行的任何更新实体的子集合。
目前我正在做这样的事情:
public async Task Post([FromBody]List<ConfiguredAPIDTO> configuredAPIs)
{
using (PAMDatabase db = new PAMDatabase(WebApiConfig.PAMConnectionString))
{
// Loop through each Configured API DTO object that was supplied
foreach (ConfiguredAPIDTO Capi in configuredAPIs)
{
// Locate the corresponding entity in the database
var dbcapi = db.context.configuredAPIs.FirstOrDefault(c => c.configuredAPIID == Capi.configuredAPIID);
// Use AutoMapper to update existing entity object
Mapper.Map<ConfiguredAPI, configuredAPI>(Capi, dbcapi);
}
// Save updated entities to DB
await db.context.SaveChangesAsync(); // throws an InvalidOperationException
}
}
问题是,每个ConfiguredAPIDTO
对象实际上都有ConfiguredAPIExternalURLDTO
个对象的子集合,如下所示:
public class ConfiguredAPIDTO
{
public int configuredAPIID { get; set; }
public string internalBaseURL { get; set; }
public int orgID { get; set; }
public bool preventDefaultEndpointAssignment { get; set;}
public Api api { get; set; }
public ICollection<ConfiguredAPIExternalURLDTO> configuredAPIExternalURLs { get; set; }
}
public class ConfiguredAPIExternalURL
{
public string configuredAPIExternalBaseURL { get; set; }
public int configuredAPIID { get; set; }
}
目前,我可以确认AutoMapper正在使用新属性正确更新configuredAPI
,并且还正确更新configuredAPI.configuredAPIExternalURLs
子集合 - 但是当我呼叫SaveChangesAsync()
时我得到一个InvalidOperationException。
首先尝试这一点,我不确定我应该做多少人工检查来帮助实体框架。当我像这样更新实体时会自动删除任何孤立的对象吗?或者我应该手动比较新旧子集合以查看已更改的内容并相应地执行我自己的删除/插入?此外,EF是否要求我的外键是正确的,或者只是将一个对象插入到一个集合中足以让它理解正在发生的事情。也许我的整个模式在这里是错误的,我应该分别处理每个实体。