如何以及在哪里使用实体框架Core 6验证ASP.NET Core MVC中属性/属性的唯一性



我想检查一下,用户表记录中是否已经存储了特定的电子邮件。

如果存在,则ModelState.IsValid在控制器操作中返回false。

我理解独特约束的必要性,也理解种族条件的问题。这些现在不是我关心的问题。

在这一点上,我只想让ModelState.IsValid在正确的地方查询数据并使模型无效后返回false。

我是否应该实施这样的验证:

DbContext中的
  1. 在我的实体类(用户/公司等(中
  2. SomeCustomValidation类中
  3. 直接在控制器中(因为在那里我已经可以查询数据库了…(
  4. 在其他地方

很好的奖励是创建可在所有实体中重复使用的解决方案:(

我该怎么做?

您可以自定义如下验证属性:

public class TestEmailAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
var context = (YourDbContext)validationContext.GetService(typeof(YourDbContext));
if(!context.User.Any(a=>a.Email==value.ToString()))
{
return ValidationResult.Success;
}
return new ValidationResult("Email exists");
}
}

型号:

public class User
{
public int Id { get; set; }
[TestEmail]
public string Email { get; set; }
}

视图(Test.cs.html(:

@model User
<form method="post" asp-action="Test" asp-controller="Home">   
<div class="form-group">
<input asp-for="Email" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<input type="submit" value="Post"/>
</form>

控制器:

//GET render the Test.cshtml
public async Task<IActionResult> Test()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Test(User user)
{
if(!ModelState.IsValid)
{
return View(user);
}
return RedirectToAction("Index");
}

更好的方法是在每次插入或更新之前进行检查:

if(db.Table.Any(x => x.UniqueCloumn == newValue))
error = "this record is already exist"
else
{  
db.Table.Add(newObject);
db.Savechanges() 
}

还有一些我不建议使用的可重用代码方法:https://www.codeproject.com/Tips/1143215/Validate-a-Unique-Constraint-at-dbContext-Validate

最新更新