我有一种添加记录的方法,但是在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却不能。
答案 0 :(得分:0)
您的ExampleSchema
在Password
属性上有冲突的数据注释:
[Required]
[NotMapped]
public string Password { get; set; }
Required注释告诉EF特定属性是 必填。
表示应从数据库中排除属性或类 映射。
听起来像是您的情况,您可能只想删除NotMapped
属性。