Microsoft.EntityFramework.core.sqlite возвращает нулевое значение - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над проектом Xamarin pcl для .netstandard 2.0 и использую Microsoft.EntityFramework.core.sqlite

DatabaseContext

public class DatabaseContext: DbContext
{
    private readonly string _databasePath;

    // Hotworks related tables
    public DbSet<A> a { get; set; }
    public DbSet<B> b { get; set; }
    public DbSet<C> c { get; set; }
    public DbSet<D> d { get; set; }

    public DatabaseContext(string databasePath)
    {
        _databasePath = databasePath;
        this.Database.EnsureCreated();
    }

    public override int SaveChanges()
    {
        AddTimestamps();
        return base.SaveChanges();
    }

    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        AddTimestamps();
        return (await base.SaveChangesAsync(true, cancellationToken));
    }

    private void AddTimestamps()
    {
        var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseEntity && (x.State == EntityState.Added || x.State == EntityState.Modified));


        foreach (var entity in entities)
        {
            var now = DateTime.UtcNow; // current datetime

            if (entity.State == EntityState.Added)
            {
                ((BaseEntity)entity.Entity).CreatedAt = now;
            }
        ((BaseEntity)entity.Entity).UpdatedAt = now;              
        }
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {           
        optionsBuilder.UseSqlite($"Filename={_databasePath}");
    }
}

Модельные классы

 public class A:BaseEntity
{
    public int id { get; set; }
    public B b { get; set; }
    public C c { get; set; }
    public virtual ICollection<D> d { get; set; }= new HashSet<D>();
    public string Name { get; set; }       
}

public abstract class BaseEntity
{
    public DateTime? CreatedAt { get; set; }
    public DateTime? UpdatedAt { get; set; }
}

Когда я добавляю объект класса 'A' в базу данных, как:

var aIns = await _databaseContext.A.AddAsync(a);          
await _databaseContext.SaveChangesAsync();
var isAdded = sIns.State == EntityState.Added;

Я получаю isAdded как ложное. Но он сохраняется в БД, как я подтвердил, получив список всех А, но все остальные элементы внутри экземпляра А, такие как B, C, и список D , обнуляются. Я также подтвердил, что перед сохранением A я сохранил отдельные экземпляры B, C и D в соответствующих таблицах.

Есть ли что-то неправильное, с чем я здесь работаю, и что еще нужно сделать? заранее спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

Вы неправильно указали информацию об отслеживании изменений.

Ваш тест должен выглядеть примерно так:

var isAdded = _databaseContext.A.Any(arow => arow.id == a.id);

Потому что вы все равно не должны заботиться о внутренностях отслеживания изменений. Вы должны позаботиться о том, могут ли данные, которые вы сохранили позже, быть загружены.

...