EF Core无法正确跟踪实体

时间:2017-03-23 20:26:21

标签: c# asp.net entity-framework entity-framework-core

嗨,我有EF核心插入实体的问题。问题是我需要插入与已存在的另一个实体相关的新实体。我用流畅的API创建了关系。我这样做了两次。首先,我正在创建汽车,并添加最后编辑的字段与Identity用户和所有工作,但当我尝试对另一个实体执行相同操作时,它崩溃了

我流利的APi代码很好用:

 builder.Entity<Car>()
            .HasOne(x => x.Owner)
            .WithMany(x => x.OwnerCars)
            .HasForeignKey(x => x.OwnerId);

这是汽车实体:

public class Car : CarBase
{
    [Key]
    public int CarId { get; set; }
    public bool IsTrailer { get; set; }
    public virtual TrailerType TrailerType { get; set; }
    public virtual int? TrailerTypeId { get; set; }
    public virtual ApplicationUser Owner { get; set; }
    public virtual string OwnerId { get; set; }
}

这里是应用程序用户实体

public class ApplicationUser : IdentityUser
{
    [MaxLength(100)]
    public string Address { get; set; }
    public DateTime CreatedDateTime { get; set; }
    public DateTime LastEditationDateTime { get; set; }
    public virtual ApplicationUser LastEditedBy { get; set; }
    public bool IsDeleted { get; set; }
    public virtual DateTime DeletedDateTime { get; set; }
    public ICollection<DriverLicenseApplicationUser> DriverLicenses { get; set; }
    public ICollection<RideApplicationUser> Rides { get; set; }
    public ICollection<Car> OwnerCars { get; set; }
    public ICollection<Car> EditedCars { get; set; }
    public ICollection<Trailer> EditedTrailers { get; set; }
    public ICollection<Customer> EditedCustomers { get; set; }

}

要添加此实体,我只调用此函数并且一切正常。

public Car CreateCar(Car car)
    {
        _context.Cars.Add(car);
        return car;
    }

但是当我想以这种方式保存这个另一个实体类型时,它会显示错误。所有步骤都是一样的,所以我不明白这一点。在这里,我将添加用于执行此操作的代码。

builder.Entity<Trailer>()
            .HasOne(x => x.TrailerType)
            .WithMany(x => x.Trailers)
            .HasForeignKey(x => x.TrailerTypeId);

这是预告片:

public class Trailer : CarBase
{
    [Key]
    public int TrailerId { get; set; }
    //[Required]
    public virtual TrailerType TrailerType { get; set; }
    public virtual int TrailerTypeId { get; set; }
}

这里是traylerTyper:

 public class TrailerType:Trackable
{
    //[Key]
    public int TrailerTypeId { get; set; }
    [MaxLength(100)]
    [Required]
    public string Type { get; set; }
    public string Note { get; set; }
    public ICollection<Car> TrailerTypeCars { get; set; }
    public ICollection<Trailer> Trailers{ get; set; }
}

并且该方法与已经提到的方法相同

public Trailer CreateTrailer(Trailer trailer)
    {
        trailer.TrailerTypeId = trailer.TrailerType.TrailerTypeId;

        //_context.Attach(trailer.TrailerType);
        var result = _context.Trailers.Add(trailer);
        return result.Entity;
    }

当我取消注释附件时,它可以工作,但我认为我不必附加这个,因为我已经得到了基于ID的关系,并且提到的示例首先效果很好。这让我毫无感觉。所以如果有人能给我建议那就太棒了。

以下是我遇到的错误:

Cannot insert explicit value for identity column in table 'TrailerTypes' when IDENTITY_INSERT is set to OFF.

看起来EF并不知道traylertype实体已经存在并且正在尝试再次插入相同的实体并且应用程序崩溃,因为它已经存在并且我不允许直接插入ID。正如我所说,我完全不知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

问题是延迟加载。 ViewModel中的Propetry与Database中的属性不完全相同,EF跟踪对象中属性的整个图形,并且不识别它是同一个对象。解决方案是只使用ID而不是整个对象。