我有一個包含三個欄位的學生表。
1.身份證。是PK 2.No。就像學生號 3.Name。學生姓名
當我使用 EF 核心更新學生姓名時。我需要確保學生姓名和學號不重復
這是我的方法
// get same name student
var currenItem = await _context.TLibInfo.FirstOrDefaultAsync(v => v.name== item.name);
// check if current is null I can update
if (currenItem == null)
{
// get student by number
var existItem = await _context.TLibInfo.FirstOrDefaultAsync(v => v.no == item.no);
if (existItem != null)
{
// then update
}
}
有沒有更好的方法讓我不要查詢兩次?
例如它不是插入。是更新。就像我有 2 條記錄一樣。
id:1 姓名:davis 編號:A
id:2 姓名:Jack 號碼:B
我想更新 id:2 記錄。
我想確保當我更新名稱時,名稱不是 davis
uj5u.com熱心網友回復:
您可以使用以下查詢:
var students = await _context.TLibInfo
.Where(s => s.no == item.no || s.name == item.name && s.no != item.no)
.ToListAsync();
if (students.Count == 0)
{
// nothing to update
}
else if (students.Count > 1)
{
// another student with given name already exists
}
else
{
var student = students[0];
if (student.no != item.no)
{
// nothing to update
}
else
{
student.name = item.name;
await _context.SaveChangesasync();
}
}
但是,當另一個用戶同時嘗試更改學生的姓名時,這并不能保證一致性。所以更好的是,開始事務并在Name列上添加唯一約束。
uj5u.com熱心網友回復:
首先,您可以使用一個查詢來做到這一點:
var student = await _context.TLibInfo.FirstOrDefaultAsync(s => s.name != item.name && s.no == item.no);
if (student != null)
{
//update
}
但
如果您需要這樣的行為,那么在您的資料庫模型上定義一個唯一索引會很有用。更詳細的資訊在這里。在這篇 Microsoft 文章中,您將找到有關如何在屬性上創建索引的資訊,但您的目標是在Student物體的兩個屬性(名稱和編號)上創建唯一索引。
uj5u.com熱心網友回復:
下面添加了完美答案:您可以使用此查詢來執行此操作:
int studentsCount = await _context.TLibInfo
.Where(s => s.no == item.no || s.name.ToLower() == item.name.ToLower() && s.no != item.no)
.CountAsync();
if (studentsCount == 0)
{
//update
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489857.html
標籤:C# 。网 sql服务器 .net-core 实体框架核心
上一篇:如何使用VisualStudioCode自動生成資料庫圖?
下一篇:觸發與程序來更新計算列
