我剛開始使用 SQL 并試圖讓我的第一個示例作業。我有兩個具有一對多關系的表:
public class Customer
{
public Guid Id { get; set; }
public string CompanyName { get; set; }
public string Address { get; set; }
public virtual ICollection<Project> Projects { get; set; }
}
和
public class Project
{
public Guid Id { get; set; }
public string Name { get; set; }
public string ProjectType { get; set; }
public Customer Customer { get; set; }
}
然后我通過 API 執行以下命令ProjectsController:
[HttpPost]
public async Task<IActionResult> Post(Project project)
{
Customer newCustomer = _context.Customers
.FirstOrDefault(c => c.Id == project.Customer.Id);
Project newProject = new Project
{
Name = project.Name,
ProjectType = project.ProjectType,
Customer = newCustomer,
};
_context.Projects.Add(newProject);
await _context.SaveChangesAsync();
return Ok(newProject.Id);
}
但是,由于我在資料庫中已經有一個具有此 ID 的客戶,因此出現例外(在創建新專案時,無需創建新客戶;客戶是從專案創建對話框的下拉框中選擇的):
Microsoft.EntityFrameworkCore.DbUpdateException:保存物體更改時出錯。有關詳細資訊,請參閱內部例外。
Microsoft.Data.SqlClient.SqlException (0x80131904):違反 PRIMARY KEY 約束“PK_ProjectStates”。無法在物件“dbo.ProjectStates”中插入重復鍵。重復的鍵值為 (057cfca4-934b-40a4-a3f8-44840e532f4a)。該陳述句已終止。
如何以正確的方式做到這一點?
uj5u.com熱心網友回復:
您應該為您的專案物體添加 CustomerId 屬性,使其看起來像這樣:
public class Project
{
public Guid Id { get; set; }
public string Name { get; set; }
public string ProjectType { get; set; }
public Guid CustomerId { get; set; }
public Customer Customer { get; set; }
}
然后,當您添加新專案時,您將傳遞 CustomerId 而不傳遞 Customer 物件 - 例如,如果您想獲取包含 Customer 的專案資訊,它只是導航屬性。
[HttpPost]
public async Task<IActionResult> Post(Project project)
{
//You can use FirstOrDefaultAsync here
Customer newCustomer = await _context.Customers.FirstOrDefaultAsync(c => c.Id == project.CustomerId);
// You should also add validation here because when there is no customer with that id, you'll recive NullReferenceException while assigning CustomerId so you can add something like this
if(newCustomer is null)
{
return NotFound();
}
Project newProject = new Project
{
Name = project.Name,
ProjectType = project.ProjectType,
CustomerId = newCustomer.Id,
};
//You can use AddAsync here
await _context.Projects.AddAsync(newProject);
await _context.SaveChangesAsync();
return Ok(newProject.Id);
}
uj5u.com熱心網友回復:
試試這個,只需更改 _context.Projects.Add(newProject);為 newCustomer.Projects.Add(newProject);
此外,在Customer = newCustomer,我們向現有客戶添加/分配專案時洗掉分配。
總的來說,你的新方法看起來像這樣。(有以上兩個變化)
[HttpPost]
public async Task<IActionResult> Post(Project project)
{
Customer newCustomer = _context.Customers
.FirstOrDefault(c => c.Id == project.Customer.Id);
Project newProject = new Project
{
Name = project.Name,
ProjectType = project.ProjectType
};
newCustomer.Projects.Add(newProject);
await _context.SaveChangesAsync();
return Ok(newProject.Id);
}
希望你明白究竟是什么變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/374514.html
上一篇:從.NETCore2.2遷移到.NETCore3.1-LINQLEFTJOIN-在DefaultIfEmpty上呼叫Take()不會轉換為服務器端SQL
