C# 从特定的select查询更新记录时了解实体框架

C# 从特定的select查询更新记录时了解实体框架,c#,entity-framework,.net-core,C#,Entity Framework,.net Core,希望有人能帮助我更多地了解.net核心实体框架在下面的场景中是如何工作的 我有一个更新功能,它工作得非常好。 但是当我尝试优化我的select查询时,我遇到了一个错误。 为了更好地理解,这里有3个类及其关系: public class Dealer { public int Id { get; set; } public string Name { get; set; } ... public virtual ICollection<Vehicle>

希望有人能帮助我更多地了解.net核心实体框架在下面的场景中是如何工作的

我有一个更新功能,它工作得非常好。
但是当我尝试优化我的select查询时,我遇到了一个错误。 为了更好地理解,这里有3个类及其关系:

public class Dealer
{
    public int Id { get; set; }
    public string Name { get; set; }
    ...
    public virtual ICollection<Vehicle> Vehicles { get; set; }
}

public class Vehicle
{
    public string Id { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    ...
    public int DealerId { get; set; }
    public Dealer Dealer { get; set; }
    public virtual ICollection<Accessory> Accessories { get; set; }
}

public class Accessory
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }
    public string VehicleId { get; set; }
    public Vehicle Vehicle { get; set; }
}
根据日志可以看出,魔术按以下顺序发生:

  • 插入[车辆]
  • 更新[经销商]
  • 插入[附件]
  • 现在,我正在尝试优化速度,因为经销商有很多字段,所以我决定只选择经销商需要的字段,以便缩短查询时间。因此,我像这样更新了方法

    public Dealer Get(int id)
    {
        return _db.Where(x => x.Id == id)
            .Select(x => new Dealer 
            {
                Id = x.Id,
                Name = x.Name,
                ...
            })
            .FirstOrDefault();
    }
    
    就在那时,我遇到了这个错误 SqlException:INSERT语句与外键约束“FK\U附件\U车辆\U Id”冲突。冲突发生在数据库表“dbo.Vehicles”列“Id”中

    INSERT INTO [Accessories] ([Name], [Quantity], [VehicleId])  
    VALUES (@p0, @p1, @p2);  
    SELECT [Id] FROM [Accessories] WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity(); 
    
    很明显,这是因为它试图首先插入到[附件]中,而不是第三步的工作版本中

    所以在这里,我希望有人能解释为什么在我的select查询中指定特定字段会导致这样的行为:当涉及FK时,.net首先插入附件而不是车辆


    提前谢谢。

    表中的
    车辆是否启用了自动PK?@JohnB抱歉,我已经更新了代码。车辆实际上使用guid作为其Id。
    
    public Dealer Get(int id)
    {
        return _db.Where(x => x.Id == id)
            .Select(x => new Dealer 
            {
                Id = x.Id,
                Name = x.Name,
                ...
            })
            .FirstOrDefault();
    }
    
    INSERT INTO [Accessories] ([Name], [Quantity], [VehicleId])  
    VALUES (@p0, @p1, @p2);  
    SELECT [Id] FROM [Accessories] WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();