C# 跟踪实体框架中复杂类型的更改
如何获取在DBContext.ChangeTracker中更改了复杂类型的实体?它可以很好地处理原语 模型C# 跟踪实体框架中复杂类型的更改,c#,entity-framework,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 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)将显示一个更改。。。正如所料
如果我为客户指派了一名销售人员,ChangeTracker就不会接收它。(因为EF不跟踪复杂类型的更改)
任何帮助都将不胜感激。@Pawel为我指明了正确的方向 我更改了SalesPerson类以包含一个列表,并向Client类添加了一个SalesPersonId属性(见下文)。然后,我添加了一些DbModelBuilder(EF的fluentapi)逻辑来连接所有内容 型号
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; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>()
.HasOptional(e => e.SalesPerson)
.WithMany(e => e.Clients)
.HasForeignKey(e => e.SalesPersonId);
}
公共类销售人员
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共虚拟列表客户端{get;set;}
}
公共类客户端
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟销售人员销售人员{get;set;}
public int?salersonid{get;set;}
}
DbContext类
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; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>()
.HasOptional(e => e.SalesPerson)
.WithMany(e => e.Clients)
.HasForeignKey(e => e.SalesPersonId);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.has可选(e=>e.salesson)
.有许多(e=>e.Clients)
.HasForeignKey(e=>e.salersonid);
}
存储库保持不变。现在它将检测到更改,因为salersonid(原语)将更改
谢谢@Pawel实体框架当然可以处理“复杂类型”。这通常会映射到
SalesPerson
的子表,然后将其作为单独的实体进行跟踪,并与Client
建立关系。但仅供参考,EF将为您保存所有更改。不确定您试图在此处实现什么。我正在尝试从ChangeTracker中获取EntityState为“EntityState.Added”或“EntityState.Modified”的项。EF不支持complext类型的变更跟踪,这一点已经得到了很好的证明?销售人员
是否不是EF上下文的一部分?为什么它要跟踪客户
,而不是销售人员
。当然,销售人员是上下文的一部分。。。我不知道你是怎么得出结论的。下面是我目前打开的两个链接,它们表明复杂类型没有被跟踪。。而且(我在这方面读过很多其他的研究),因为你们的关系只是英孚无法确定销售人员是否有客户的一种方式。这还取决于客户是新实体还是现有实体。您可以修复关系,使您可以从客户导航到销售人员,反之亦然,也可以手动创建实体,EF应修复关系。如果客户机是现有实体,则需要附加该实体或从数据库中提取,以防止创建重复的实体。