Заставить AutoMapper создавать новую коллекцию вместо повторного использования - PullRequest
0 голосов
/ 26 февраля 2019

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);

    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...