خطای attached بر روی تیبل واسط در EF
سلام من یک تیبل commodity دارم که یک لیست از Stock ها داره به کمک تیبل واسط CommodityStockList
تیبل CommodityStockList یک تیبل واسط برای ایجاد رابطه یک به چند بین stock ها و commodity هست
stock ها قبلا ایجاد شدن و فقط در زمان ثبت commodity میگم چند stock رو بهش منتصب شده
که خطای زیر رو در زمان ایجاد commodity میده
'The instance of entity type 'Stock' cannot be tracked because another instance with the key value '{ID: 5}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.'
کد به صورت GenericRepositoryنوشته شده
پروپرتی های تیبل واسط CommodityStockList
[Key]
[Column("ID")]
public long ID { get; set; }
[Column("commodityID")]
public long? CommodityID { get; set; }
// [NotMapped]
public virtual Commodity CommodityItem { get; set; }
[Column("stockID")]
public long? StockID { get; set; }
// [NotMapped]
public virtual Stock StockItem { get; set; }
/// <summary>
/// موجودی انبار
/// </summary>
[Column("amount")]
public decimal Amount { get; set; }
/// <summary>
/// موجودی اولیه
/// </summary>
private decimal _initialAmount;
[DataType("decimal(21, 6)")]
[Column("initialAmount")]
public decimal InitialAmount
{
get { return Helper.Round(_initialAmount); }
set { _initialAmount = value; }
}
[Column("unitID")]
public long? UnitID { get; set; }
// [NotMapped]
public virtual Unit UnitItem { get; set; }
[Column("salePriceID")]
public long? SalePriceID { get; set; }
// [NotMapped]
public virtual PriceInfo SalePriceItem { get; set; }
کد ایجاد که خطا میده
public virtual TEntity Insert(TEntity entity)
{
//_context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
//_context.Entry(entity).State = EntityState.Detached;
var addedItem = _dbset.Add(entity);
// _context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;
return addedItem.Entity;
}
NoTracking هم جواب نداد !
نکته: نمیخوام Stock تغییر کنه فقط میخوام Commodity ذخیره بشه و بعد CommodityStockList رو خودم دونه دونه لوپ بزنم و ذخیره کنم .
نقل قول: خطای attached بر روی تیبل واسط در EF
پروپرتی های داخل کلاس CommodityStockList که خودشون نوع کلاس هستن باید null بشن تا ذخیره بشه به عبارتی پروپرتی های CommodityItem وStockItem و UnitItem و ... مقدار null باشن و پروپرتی های معادلشون که ایدی رکورد ها رو نگه میدارن مقدار دهی بشن
نقل قول: خطای attached بر روی تیبل واسط در EF
برای فراخوانی اطلاعات به صورت Include اگر در ورودی Include از حالت رشته ای استفاده میکنید هواستون باشه نام پرورپریتی که قراره پر بشه رو باید به ورودی بدید نه نام کلاس رو مثال:
var eere= _eFContextA.Respondents.Include("PersonItem").ToLi st();
در مثال بالا PersonItem نام پروپرتی که قراره در لیست کلاس Respondent لود بشه
if (!includes.Contains(typeof(Respondent).GetProperty (nameof(Respondent.AccessGroupItem)).Name))
{
includes.Add(typeof(Respondent).GetProperty(nameof (Respondent.AccessGroupItem)).Name);
}
if (!includes.Contains(typeof(Respondent).GetProperty (nameof(Respondent.PersonItem)).Name))
{
includes.Add(typeof(Respondent).GetProperty(nameof (Respondent.PersonItem)).Name);
}
اگر تو در تو به صورت یک به یک بود به این صورت مقدار دهی میشه
if (!includes.Contains(typeof(Fund).GetProperty(nameo f(Fund.BankAccount)).Name))
{
includes.Add(typeof(Fund).GetProperty(nameof(Fund. BankAccount)).Name);
if (!includes.Contains(typeof(Fund).GetProperty(nameo f(Fund.BankAccount)).Name + ".Branch"))
{
includes.Add(typeof(Fund).GetProperty(nameof(Fund. BankAccount)).Name + ".Branch");
}
if (!includes.Contains(typeof(Fund).GetProperty(nameo f(Fund.BankAccount)).Name+ ".Owner"))
{
includes.Add(typeof(Fund).GetProperty(nameof(Fund. BankAccount)).Name + ".Owner");
}
}