.net - 让 AutoMapper 创建新集合而不是重用现有集合?
问题描述
AutoMapper 在映射时重用现有集合。虽然在许多情况下这可能是可取的,但在我的情况下会导致问题,因为 EF Core 未检测到 List 属性已更改。(我使用 JSON 将属性序列化为单个字符串字段)。有没有办法强制使用 AutoMapper 创建一个新列表?
这是代码:
public class MyEntity
{
public long Id {get;set;}
public IList<string> MyStrings {get;set;} = new List<String>();
}
public class SomeOtherClass
{
public IList<string> MyStrings {get;set;} = new List<String>();
}
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.CreateMap<SomeOtherClass, MyEntity>();
});
using (var c = new TestContext())
{
Console.WriteLine("deleting database...");
Console.WriteLine(c.Database.EnsureDeleted());
Console.WriteLine("creating database...");
Console.WriteLine(c.Database.EnsureCreated());
Console.WriteLine("creating database...done.");
}
using (var c = new TestContext())
{
MyEntity e = new MyEntity();
c.MyEntities.Add(e);
c.SaveChanges();
}
using (var c = new TestContext())
{
MyEntity e = c.MyEntities.Single();
SomeOtherClass other = new SomeOtherClass() {
MyStrings = {"a string"}
};
AutoMapper.Mapper.Map(other, e);
Console.WriteLine("MyStrings: " + string.Join(",",e.MyStrings)); //prints correctly
Console.WriteLine(c.Entry(e).State); //prints Unchanged
c.SaveChanges();
}
using (var c = new TestContext())
{
MyEntity e = c.MyEntities.Single();
Console.WriteLine("MyStrings: " + string.Join(",",e.MyStrings)); //prints empty (because entity wasn't updated)
}
上下文类在哪里
public class TestContext: DbContext
{
public void AddJsonConversion<TEntity, TProperty>(EntityTypeBuilder<TEntity> entityTypeBuilder,
Expression<Func<TEntity, TProperty>> propertyExpression) where TEntity : class
{
entityTypeBuilder.Property(propertyExpression)
.HasConversion(v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<TProperty>(v));
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
AddJsonConversion(modelBuilder.Entity<MyEntity>(), e => e.MyStrings);
}
public DbSet<MyEntity> MyEntities { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseMySql("server=localhost;database=mydbx;user=root;password=abc", mySqlOptions => { mySqlOptions.ServerVersion(new Version(5,7,24),ServerType.MySql); });
}
optionsBuilder
.UseLazyLoadingProxies()
.EnableSensitiveDataLogging();
base.OnConfiguring(optionsBuilder);
}
}
解决方案
推荐阅读
- r - 以编程方式从 RData 文件集合中提取对象
- excel - 使用 VBA 和高级筛选器在一个工作表中汇总数据失败
- python - TypeError:尝试绘制 2D 信号时,只能将 size-1 数组转换为 Python 标量
- javascript - 使用 Redux 为 ReactJS 中的每个数据块创建一个新的 div
- pandas - 获取列的部分行的最快方法=数据框中的某个值
- javascript - 如果值大于跨度标记内的 99,如何更改字符串值的 CSS 边距
- c# - 如何将多个对象序列化/反序列化为单个 XML 文件?
- python - 在 y 坐标的多维数组上矢量化一维插值
- flutter - Dart-Code 正在切换到使用语言服务器协议以提高性能。您想现在启用它吗?
- node.js - 从 URL 读取文件时是否可以发出请求?