我有一个从cshtml视图上传到后端的模型。此模型也是数据库表的表示形式.
此代码查找HTTP,如下所示:
[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使用,而不应用于数据库表。
下面是代码示例:
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上的
发布于 2020-01-29 07:52:36
由于属性和需求不同,您应该有两个不同的对象。
// 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而不是数据注释配置所需的属性。
// Call this method in your context.
protected override void OnModelCreating(your_builder){
modelBuilder.Entity<Conversation>()
.Property(p => p.KontierungQVP)
.IsRequired();
}一般情况下,您希望有两个不同的上下文。您将在其中初始化您的数据库。另外一个是由FluentAPI (不是数据注释)定义所需属性的地方。
因此,重新介绍一个DbContext用于您的DB创建,另一个用于您的操作。当然,这会导致不同的情况,而且很容易忘记对数据库的验证,等等。
https://stackoverflow.com/questions/59962488
复制相似问题