EF 6.x AddorUpdate上下文在更新时失败

时间:2019-01-31 18:44:07

标签: c# entity-framework-6

我有一种添加记录的方法,但是在EF 6中使用let newInvite = await channel.createInvite({ maxUses: 1, // After one use it will be void unique: true, // That tells the bot not to use an existing invite so that this will be unique maxAge: 86400 // By default invites last 24 hours. If you want to change that, modify this (0 = lasts forever, time in seconds) }); 时,更新记录失败并出现验证错误。

该错误表明缺少必填字段,但是该字段实际上存在并已填充。

域对象

context.AddOrUpdate

EF对象

public class ExampleSchema {

  public int Id { get; set; }

  [Required]
  public string Name { get; set; }

  [Required]
  [NotMapped]
  public string Password { get; set; }

}

我们使用 AutoMapper 在域对象和EF对象之间进行映射。这种映射是通过简单的public class ExampleSchemaEf : ExampleSchema { public string SecurePassword { get; set; } } 语句完成的,该语句对从域对象转换为EF对象时用户提供的密码进行加密。

MapFrom

以下是将更改写入数据库的方法。

cfg.CreateMap<ExampleSchema, ExampleSchemaEf>().ForMember(e => e.SecurePassword, opt => opt.MapFrom(e => e.Password.Encrypt(config.HashPassphrase)));

添加新记录时没有问题。但是,更新记录会生成private async Task<int> SaveInternalAsync(TEntity entity, DbContext context { var efEntity = DbContextProvider.Map<TEntity, TEfEntity>(entity); context.Set<TEfEntity>().AddOrUpdate(efEntity); await context.SaveChangesAsync(); return efEntity.Id; } 。但是,如果我中断该过程并检查efEntity的值,则Password和SecurePassword都存在并且正确填充。所以我不明白验证错误。

注意:添加以下代码行可以使我变通,但是我仍然想理解为什么EF验证程序认为尝试更新的密码丢失。

Entity Validation Error: "Password is required"

修改:

基于以下DevNull的答案,我编辑了EF对象,以使其不派生自域对象,然后从“密码”字段中删除了Required属性。这样可以解决验证错误,而无需禁用验证。我仍然很好奇,为什么在两种情况下都存在该属性值时,add可以起作用,但是update却不能。

1 个答案:

答案 0 :(得分:0)

您的ExampleSchemaPassword属性上有冲突的数据注释:

[Required]
[NotMapped]
public string Password { get; set; }

[Required]

  

Required注释告诉EF特定属性是   必填。

[NotMapped]

  

表示应从数据库中排除属性或类   映射。


听起来像是您的情况,您可能只想删除NotMapped属性。