如何解决如何检查具有相同外键的多行并逐步更新它们
我试着解释我的问题。
我的数据库中有一个表,其中有不止一行具有相同的 FK(Foreinkey),每行都有列 ID
、GuestUserName
、GuestUserImage
、GuestFrame
, Male
、Female
、FK_Party
和 FK_User
。除 Id
和 FK_Party
之外的所有列都有一个标准值。 FK_User
默认设置为 null
(请参阅我的 Party_Guest_TBL
)。
那是我参加派对的默认客人。现在,如果我尝试以用户身份加入这个聚会,我想检查 FK_User
的值是否仍然是 null
以及是否使用来自用户的 UserId
更新值。
var guestNumber = await _db.Party_GuestNumber_TBL.FirstOrDefaultAsync(x => x.FK_Party == PartyId);
var partyGuest = await _db.Party_Guest_TBL.FirstOrDefaultAsync(x => x.FK_Party == PartyId);
var user = await _db.User_TBL.FirstOrDefaultAsync(x => x.Id == UserId);
var gender = await _db.Gender_TBL.FirstOrDefaultAsync(x => x.FK_User == UserId);
if (partyGuest.FK_Party == PartyId && partyGuest.FK_User == null && partyGuest.Male == gender.Male)
{
partyGuest.FK_User = user.Id;
partyGuest.GuestUserName = user.UserName;
partyGuest.GuestimageUrl = user.ImageUrl;
partyGuest.GuestFrame = user.Frame;
}
这很好用,但我的问题是这段代码只检查第一行,而不检查其他行。这意味着一次只能更新一行。但我想逐步检查每一行,直到每个 FK_User 列都更新了 UserId。
解决方法
编辑:考虑更多,我认为您的系统设置需要评估。为什么 PartyGuests
表有很多行带有 User_FK==null
?听起来很奇怪。
但无论如何,这就是我认为您明确问题的答案的总体思路。
假设有一个(正确搭建的)用户表需要添加
var userIds = new int[]{1,2,3,4};
var users = await _db.User_TBL
.Include(u => u.Gender)
.Where(u => userIds.Contains(u.Id) &&
u.Gender == Gender.Male)
.AsNoTracking();
现在您可以将它们添加到聚会中(假设有足够的空位置)
var nullPartyGuests = await _db.Party_Guest_TBL
.Where(pg => pg.FK_Party == PartyId &&
pg.FK_User == null)
.GetEnumerator(); // with tracking
foreach(var user in users) {
var partyGuest = nullPartyGuests.Current;
//your stuff
partyGuest.FK_User = user.Id;
partyGuest.GuestUserName = user.UserName;
partyGuest.GuestImageUrl = user.ImageUrl;
partyGuest.GuestFrame = user.Frame;
// increase enumerator
nullPartyGuests.MoveNext();
}
// then save everything to the DB.
await _db.SaveChanges();
注意,未测试
,我自己喜欢它。
var guestNumber = await _db.Party_GuestNumber_TBL.FirstOrDefaultAsync(x => x.FK_Party == PartyId);
var user = await _db.User_TBL.FirstOrDefaultAsync(x => x.Id == UserId);
var gender = await _db.Gender_TBL.FirstOrDefaultAsync(x => x.FK_User == UserId);
var partyGuest = _db.Party_Guest_TBL.Where(x => x.FK_Party == PartyId && x.FK_User == null);
var maleGuest = partyGuest.FirstOrDefault(x => x.FK_User == null && x.Male == gender.Male);
var femaleGuest = partyGuest.FirstOrDefault(x => x.FK_User == null && x.Female == gender.Female);
var alreadyJoined = _db.Party_Guest_TBL.Where(u => u.GuestUserName == user.UserName).SingleOrDefault();
if (alreadyJoined != null)
{
return BadRequest("This User already join the party");
}
else if (maleGuest.Male == gender.Male)
{
maleGuest.FK_User = user.Id;
maleGuest.GuestUserName = user.UserName;
maleGuest.GuestImageUrl = user.ImageUrl;
maleGuest.GuestFrame = user.Frame;
}
else if (femaleGuest.Female == gender.Female)
{
femaleGuest.FK_User = user.Id;
femaleGuest.GuestUserName = user.UserName;
femaleGuest.GuestImageUrl = user.ImageUrl;
femaleGuest.GuestFrame = user.Frame;
}
_db.SaveChanges();
@JHBonarius 感谢您帮助我编写代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。