C# 如何使用实体框架将相关实体更改为另一个现有实体
我有两门课:C# 如何使用实体框架将相关实体更改为另一个现有实体,c#,entity-framework,C#,Entity Framework,我有两门课: public partial class ShipmentRoutePointDb { public long Id { get; set; } // Primary key public System.Guid Uuid { get; set; } public virtual TransportInfoDb NextTransportInfo { get; set; } } public partial class TransportInfoDb {
public partial class ShipmentRoutePointDb
{
public long Id { get; set; } // Primary key
public System.Guid Uuid { get; set; }
public virtual TransportInfoDb NextTransportInfo { get; set; }
}
public partial class TransportInfoDb
{
public TransportInfoDb()
{
this.CertifiedConsignments = new HashSet<CertifiedConsignmentDb>();
this.TransportInfoGroups = new HashSet<TransportInfoGroupDb>();
}
public long Id { get; set; }
public string VehicleNumber { get; set; }
public virtual ICollection<CertifiedConsignmentDb> CertifiedConsignments { get; set; }
public virtual ICollection<TransportInfoGroupDb> TransportInfoGroups { get; set; }
}
然后,我需要检查是否在TransportInfoDb中创建了新记录,或者是否已经存在具有类似参数的记录:
var duplicate = transportInfoRepository.GetByParams(shipmentRoutePointDb.NextTransportInfo.VehicleNumber);
如果我能找到这样的记录,我会更新shipmentRoutePointDb,如下所示:
shipmentRoutePointDb.NextTransportInfo = duplicate;
shipmentRoutePointDb.NextTransportId = duplicate.Id;
_shipmentRoutePointRepository.Update2(shipmentRoutePointDb);
public void Update2(ShipmentRoutePointDb entity)
{
var entr = _context.Entry<ShipmentRoutePointDb>(entity);
entr.State = EntityState.Modified;
SaveChanges();
}
shipmentRoutePointDb.NextTransportInfo=重复;
shipmentRoutePointDb.NextTransportId=replicate.Id;
_shipmentRoutePointRepository.Update2(shipmentRoutePointDb);
公共无效更新2(ShipmentRoutePointDb实体)
{
var entr=_context.Entry(实体);
entr.State=EntityState.Modified;
保存更改();
}
但是SaveChanges()引发了一个异常:
System.InvalidOperationException:“引用完整性约束
发生冲突:上的“TransportInfoDb.Id”的属性值
关系的一端与的属性值不匹配
另一端为“ShipmentRoutePointDb.NextTransportId”
我知道我还没有列出我使用的一些方法,但是它们工作得很好,它们的名称也很简单。我的朋友,我相信你唯一需要做的就是通过传递id和参数进行如下更新:
public void Update2(var id, type entity)
{
var result = _context.tableName.SingleOrDefault(b => b.NextTransportId == id);
if (result != null)
{
try
{
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
这有帮助。主要原因是在此项目上禁用了检测更改
public void Update2(var id, type entity)
{
var result = _context.tableName.SingleOrDefault(b => b.NextTransportId == id);
if (result != null)
{
try
{
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
public void Update2(long transportId, long shipmentRouteId)
{
var shipment = _context.ShipmentRoutePointDb.FirstOrDefault(x => x.Id == shipmentRouteId);
_context.ShipmentRoutePointDb.Attach(shipment);
shipment.NextTransportId = transportId;
_context.ChangeTracker.DetectChanges();
SaveChanges();
}