嗨,我有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。正如我所说,我完全不知道为什么会这样。
答案 0 :(得分:0)
问题是延迟加载。 ViewModel中的Propetry与Database中的属性不完全相同,EF跟踪对象中属性的整个图形,并且不识别它是同一个对象。解决方案是只使用ID而不是整个对象。