.net core 验证注释-实体框架核心

.net core 验证注释-实体框架核心,.net-core,entity-framework-core,data-annotations,.net Core,Entity Framework Core,Data Annotations,我有一个从cshtml视图发布到后端的模型。此模型也是数据库表的表示形式 此代码查找HTTP POST,如下所示: [HttpPost] 公共IActionResult创建akg(对话akg) { if(ModelState.IsValid&&valid3ord4values(akg)) { akg.RDPflichfelderBefuellt=true; } 其他的 { akg.RDPflichfelderBefuellt=false; } 如果(akg.Kommentare==null) {

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

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

[HttpPost]
公共IActionResult创建akg(对话akg)
{
if(ModelState.IsValid&&valid3ord4values(akg))
{
akg.RDPflichfelderBefuellt=true;
}
其他的
{
akg.RDPflichfelderBefuellt=false;
}
如果(akg.Kommentare==null)
{
akg.Kommentare=新列表();
}
如果(akg.AuftragsklaerungsgespraechId==0)
{
this.MyDatabase.Conversation.Add(akg);
}
其他的
{
this.MyDatabase.Conversation.Update(akg);
}
this.MyDatabase.SaveChanges();
返回操作(“索引”);
}
表示模型的类称为Conversation。有些属性由验证注释进行注释。注释应仅由Controller/ModelState.IsValid使用,而不是用于数据库表

以下是代码示例:

公共课堂对话
{
public int ConversationId{get;set;}
[必需(ErrorMessage=“此字段是必需的。”)]
公共日期时间?DatumAKG{get;set;}
[MaxLength(256,ErrorMessage=“此字段不能超过256个字符”)]
公共字符串KontierungFertigungskosten{get;set;}
[MaxLength(256,ErrorMessage=“此字段不能超过256个字符”)]
公共字符串KontierungQVP{get;set;}
[MaxLength(256,ErrorMessage=“此字段不能超过256个字符”)]
公共字符串KontierungLayoutkosten{get;set;}
[MaxLength(256,ErrorMessage=“此字段不能超过256个字符”)]
公共字符串kontierungbeschaffong{get;set;}
公共布尔RDPflichfelderBefuellt{get;set;}
}
ModelState.IsValid仅用于验证布尔值是否为真。不需要其他验证

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

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

我想做的是:

  • 控制器的验证

  • 没有更改数据库设计的验证批注


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

    // 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个上下文,并使用FluentAPI而不是数据注释配置所需的属性

    // Call this method in your context.
    protected override void OnModelCreating(your_builder){
        modelBuilder.Entity<Conversation>()
            .Property(p => p.KontierungQVP)
            .IsRequired();
    }
    
    //在上下文中调用此方法。
    模型创建时受保护的覆盖无效(您的构建器){
    modelBuilder.Entity()
    .Property(p=>p.KontierungQVP)
    .IsRequired();
    }
    
    通常,您希望有两种不同的上下文。您将在其中初始化数据库。还有一个,您将使用FluentAPI定义所需的属性(而不是数据注释)


    因此,要重述一个用于DB创建的
    DbContext
    ,另一个用于操作。当然,这会导致不一致,并且很容易忘记对数据库的验证等等。

    是否无法激活或停用验证?我只需要在http post中进行验证—在数据库中不应该有任何验证—我稍微改变了这个问题—也许有可能。谢谢你的帮助