Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跟踪实体框架中复杂类型的更改_C#_Entity Framework - Fatal编程技术网

C# 跟踪实体框架中复杂类型的更改

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;

如何获取在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)将显示一个更改。。。正如所料

如果我为客户指派了一名销售人员,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应修复关系。如果客户机是现有实体,则需要附加该实体或从数据库中提取,以防止创建重复的实体。