Asp.net core 如何使用值转换修改属性上的EntityState?
我使用ValueConverter将自定义属性类型(列表)映射到字符串。转换工作得很好,但我无法将EntityState设置为modified,因为EF找不到实体 当我修改列表时,EF不会检测到更改,这是被导出的。但是,当我试图手动更改状态时,会出现错误Asp.net core 如何使用值转换修改属性上的EntityState?,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,我使用ValueConverter将自定义属性类型(列表)映射到字符串。转换工作得很好,但我无法将EntityState设置为modified,因为EF找不到实体 当我修改列表时,EF不会检测到更改,这是被导出的。但是,当我试图手动更改状态时,会出现错误 The entity type 'List<List<Reward>>' was not found. Ensure that the entity type has been added to the model.
The entity type 'List<List<Reward>>' was not found. Ensure that the entity type has been added to the model.
找不到实体类型“List”。确保已将实体类型添加到模型中。
我找到的唯一解决办法是将属性设置为列表的克隆,这并不理想
model.PropertyName = new List<Reward>(model.PropertyName); // clone the list
model.PropertyName=新列表(model.PropertyName);//克隆列表
以下是一些示例代码:
public class RewardContainer
{
public List<List<Reward>> Rewards { get; set; }
}
// db context
protected override void OnModelCreating(ModelBuilder builder)
{
// use custom conversion, which is working fine
builder.Entity<RewardContainer>().Property(p => p.Rewards).HasConversion(ValueConverters.GetJsonConverter<List<List<Reward>>>());
}
// controller
public async Task ModifyProperty()
{
rewardContainer.Rewards[0].Add(someReward);
// try to manually change the EntityState...
dbContext.Entry(rewardContainer.Rewards).State = EntityState.Modified;
// error: The entity type 'List<List<Reward>>' was not found. Ensure that the entity type has been added to the model.
await dbContext.SaveChangesAsync();
}
公共类报酬容器
{
公共列表奖励{get;set;}
}
//数据库上下文
模型创建时受保护的覆盖无效(ModelBuilder)
{
//使用自定义转换,这很好
builder.Entity().Property(p=>p.Rewards).HasConversion(ValueConverters.GetJsonConverter());
}
//控制器
公共异步任务ModifyProperty()
{
rewardContainer.Rewards[0]。添加(someReward);
//尝试手动更改EntityState。。。
Entry(rewardContainer.Rewards).State=EntityState.Modified;
//错误:未找到实体类型“列表”。请确保已将该实体类型添加到模型中。
等待dbContext.saveChangesSync();
}
除了ValueConverter,还使用ValueComparer使EF能够跟踪转换的实体
public static class ValueConversionExtensions
{
public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> propertyBuilder) where T : class, new()
{
ValueConverter<T, string> converter = new ValueConverter<T, string>
(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<T>(v) ?? new T()
);
ValueComparer<T> comparer = new ValueComparer<T>
(
(l, r) => JsonConvert.SerializeObject(l) == JsonConvert.SerializeObject(r),
v => v == null ? 0 : JsonConvert.SerializeObject(v).GetHashCode(),
v => JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(v))
);
propertyBuilder.HasConversion(converter);
propertyBuilder.Metadata.SetValueConverter(converter);
propertyBuilder.Metadata.SetValueComparer(comparer);
return propertyBuilder;
}
}
public静态类ValueConversionExtensions
{
公共静态PropertyBuilder具有JSONversion(此PropertyBuilder PropertyBuilder),其中T:class,new()
{
ValueConverter converter=新的ValueConverter
(
v=>JsonConvert.SerializeObject(v),
v=>JsonConvert.DeserializeObject(v)??新的T()
);
ValueComparer comparer=新的ValueComparer
(
(l,r)=>JsonConvert.SerializeObject(l)==JsonConvert.SerializeObject(r),
v=>v==null?0:JsonConvert.SerializeObject(v).GetHashCode(),
v=>JsonConvert.DeserializeObject(JsonConvert.SerializeObject(v))
);
propertyBuilder.HasConversion(转换器);
propertyBuilder.Metadata.SetValueConverter(转换器);
propertyBuilder.Metadata.SetValueComparer(comparer);
返回propertyBuilder;
}
}
除了ValueConverter,还使用ValueComparer使EF能够跟踪转换的实体
public static class ValueConversionExtensions
{
public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> propertyBuilder) where T : class, new()
{
ValueConverter<T, string> converter = new ValueConverter<T, string>
(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<T>(v) ?? new T()
);
ValueComparer<T> comparer = new ValueComparer<T>
(
(l, r) => JsonConvert.SerializeObject(l) == JsonConvert.SerializeObject(r),
v => v == null ? 0 : JsonConvert.SerializeObject(v).GetHashCode(),
v => JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(v))
);
propertyBuilder.HasConversion(converter);
propertyBuilder.Metadata.SetValueConverter(converter);
propertyBuilder.Metadata.SetValueComparer(comparer);
return propertyBuilder;
}
}
public静态类ValueConversionExtensions
{
公共静态PropertyBuilder具有JSONversion(此PropertyBuilder PropertyBuilder),其中T:class,new()
{
ValueConverter converter=新的ValueConverter
(
v=>JsonConvert.SerializeObject(v),
v=>JsonConvert.DeserializeObject(v)??新的T()
);
ValueComparer comparer=新的ValueComparer
(
(l,r)=>JsonConvert.SerializeObject(l)==JsonConvert.SerializeObject(r),
v=>v==null?0:JsonConvert.SerializeObject(v).GetHashCode(),
v=>JsonConvert.DeserializeObject(JsonConvert.SerializeObject(v))
);
propertyBuilder.HasConversion(转换器);
propertyBuilder.Metadata.SetValueConverter(转换器);
propertyBuilder.Metadata.SetValueComparer(comparer);
返回propertyBuilder;
}
}