跟踪实体框架中复杂类型的变化

时间:2016-04-18 18:41:24

标签: c# entity-framework

如何在DBContext.ChangeTracker中获取具有复杂类型更改的实体?它适用于原语...

...模型

public class SalesPerson
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual SalesPerson SalesPerson { get; set; }
}

存储库方法......

public void SaveChanges()
    {
         var changedItems = _context.ChangeTracker.Entries()
                .Where(e => e.State != EntityState.Unchanged)
                .ToList();

        foreach (var item in changedItems)
        {
                if (item.State == EntityState.Modified)
                {
                    //Do something
                }
            }
        }
    }

所以...如果我更改了客户的名称,ChangeTracker(changedItems)会显示更改...正如所料。

如果我将SalesPerson分配给客户,则ChangeTracker不会提取它。 (因为EF不跟踪复杂类型的变化)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

@Pawel指出我正确的方向......

我更改了SalesPerson类以包含List并将SalesPersonId属性添加到Client类(参见下文)。然后我添加了一些DbModelBuilder(EF的流畅API)逻辑来连接所有内容。

<强>模型

public class SalesPerson
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual List<Client> Clients { get; set; }
}

public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual SalesPerson SalesPerson { get; set; }
    public int? SalesPersonId { get; set; }
}

DbContext类

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Client>()
            .HasOptional(e => e.SalesPerson)
            .WithMany(e => e.Clients)
            .HasForeignKey(e => e.SalesPersonId);
    }

存储库保持不变。现在它将检测更改,因为SalesPersonId(基元)将更改。

谢谢@Pawel