首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证注释-实体框架核心

验证注释-实体框架核心
EN

Stack Overflow用户
提问于 2020-01-29 07:43:19
回答 1查看 88关注 0票数 0

我有一个从cshtml视图上传到后端的模型。此模型也是数据库表的表示形式.

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

代码语言:javascript
复制
[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");
}

表示模型的类称为会话。有一些属性是由验证注释注释的。注释只应由Controller / ModelState.IsValid使用,而不应用于数据库表。

下面是代码示例:

代码语言:javascript
复制
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的字符串现在在数据库设计中被配置为NULL。

如果我试图在数据库中存储一个新会话,就会抛出一些字符串值不能为null的错误。

我想做的是:

控制器Database-Design上的

  1. 验证--没有更改
  2. 的验证注释
EN

回答 1

Stack Overflow用户

发布于 2020-01-29 07:52:36

由于属性和需求不同,您应该有两个不同的对象。

代码语言:javascript
复制
// 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而不是数据注释配置所需的属性。

代码语言:javascript
复制
// Call this method in your context.
protected override void OnModelCreating(your_builder){
    modelBuilder.Entity<Conversation>()
        .Property(p => p.KontierungQVP)
        .IsRequired();
}

一般情况下,您希望有两个不同的上下文。您将在其中初始化您的数据库。另外一个是由FluentAPI (不是数据注释)定义所需属性的地方。

因此,重新介绍一个DbContext用于您的DB创建,另一个用于您的操作。当然,这会导致不同的情况,而且很容易忘记对数据库的验证,等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59962488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档