PDA

View Full Version : سوال: خطای attached بر روی تیبل واسط در EF



arman_Delta2002
پنج شنبه 20 خرداد 1400, 21:44 عصر
سلام من یک تیبل 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 رو خودم دونه دونه لوپ بزنم و ذخیره کنم .

arman_Delta2002
جمعه 21 خرداد 1400, 08:59 صبح
پروپرتی های داخل کلاس CommodityStockList که خودشون نوع کلاس هستن باید null بشن تا ذخیره بشه به عبارتی پروپرتی های CommodityItem وStockItem و UnitItem و ... مقدار null باشن و پروپرتی های معادلشون که ایدی رکورد ها رو نگه میدارن مقدار دهی بشن

arman_Delta2002
یک شنبه 30 خرداد 1400, 18:38 عصر
برای فراخوانی اطلاعات به صورت Include اگر در ورودی Include از حالت رشته ای استفاده میکنید هواستون باشه نام پرورپریتی که قراره پر بشه رو باید به ورودی بدید نه نام کلاس رو مثال:

var eere= _eFContextA.Respondents.Include("PersonItem").ToList();

در مثال بالا 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");
}
}