关于验证注解:验证注解 – Entity Framework Core

Validation Annotation - Entity Framework Core

我有一个从 cshtml 视图发布到我的后端的模型。这个模型也是一个数据库表的表示。

此代码查找 HTTP POST,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[HttpPost]
public IActionResult CreateAKG(Conversation akg)
{
    if (ModelState.IsValid && ValideD3OrD4Values(akg))
    {
        akg.RDPflichfelderBefuellt = true;
    }
    else
    {
        akg.RDPflichfelderBefuellt = false;
    }
    if (akg.Kommentare == null)
    {
        akg.Kommentare = new List<Kommentar>();
    }
    if (akg.AuftragsklaerungsgespraechId == 0)
    {
        this.MyDatabase.Conversation.Add(akg);
    }
    else
    {
        this.MyDatabase.Conversation.Update(akg);
    }
    this.MyDatabase.SaveChanges();
    return RedirectToAction("Index");
}

代表模型的类称为Conversation。有一些属性由验证注释注释。注释应该只被 Controller / ModelState.IsValid 使用,而不应该用于 Database-Table。

这是代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Conversation
{
    public int ConversationId { get; set; }

    [Required(ErrorMessage ="This field is required.")]
    public DateTime? DatumAKG { get; set; }

    [MaxLength(256, ErrorMessage ="This field cannot be more than 256 characters")]
    public string KontierungFertigungskosten { get; set; }

    [MaxLength(256, ErrorMessage ="This field cannot be more than 256 characters")]
    public string KontierungQVP { get; set; }

    [MaxLength(256, ErrorMessage ="This field cannot be more than 256 characters")]
    public string KontierungLayoutkosten { get; set; }

    [MaxLength(256, ErrorMessage ="This field cannot be more than 256 characters")]
    public string KontierungBeschaffung { get; set; }
    public bool RDPflichfelderBefuellt { get; set; }
}

ModelState.IsValid 仅用于验证布尔值是真还是假。不需要其他验证。

我现在的问题是,由于数据注释的原因,通常在数据库中可能为 NULL 的字符串现在在配置为 NOT NULL 的数据库设计中。

如果我尝试在数据库中存储新对话,则会抛出错误,指出某些字符串值不能为空。

我想做的是:

  • 控制器验证

  • 没有改变数据库设计的验证注解


  • 由于属性和要求不同,您应该有 2 个不同的对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // this is you database object
    public class Conversation {
            [MaxLength(256, ErrorMessage ="This field cannot be more than 256 characters")]
            public string KontierungQVP { get; set; }

    }

    // this your Data Transfer Object
    public class ConversationDTO {
            [MaxLength(256, ErrorMessage ="This field cannot be more than 256 characters")]
            [Required]
            public string KontierungQVP { get; set; }
    }

    您的 EF 模型应始终代表数据库。如果您想添加额外的验证或条件,您应该使用另一个对象并简单地在这些对象之间传输。拥有 2 种不同类型的对象可为您提供更多模块化。

    编辑:

    有一种方法可以满足您的要求,但这不是推荐的方法,它可能会导致问题。您想使用 2 个上下文并使用 FluentAPI 而不是数据注释来配置所需的属性。

    1
    2
    3
    4
    5
    6
    // Call this method in your context.
    protected override void OnModelCreating(your_builder){
        modelBuilder.Entity<Conversation>()
            .Property(p => p.KontierungQVP)
            .IsRequired();
    }

    通常,您希望有 2 个不同的上下文。一个您将初始化数据库的地方。还有一个你将拥有由 FluentAPI 定义的所需属性(不是数据注释)。

    因此,回顾一个 DbContext 用于您的数据库创建和另一个用于您的操作。当然,这会导致差异,并且很容易忘记对数据库的验证等等。