سلام جناب مهندس عرض ادب
من در یکی از کدهای آپدیت به مشکل خوردم.کد ویرایش جدول به شکل زیر است:
using Accounting.DataLayer.Service2;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Accounting.App.Deposit
{
public partial class FrmStateCheck : Form
{
public int NumCHECK = 0;
string Statecheck = "";
public int Id = 0;
public FrmStateCheck()
{
InitializeComponent();
}
private void FrmStateCheck_Load(object sender, EventArgs e)
{
if (NumCHECK != 0)
{
this.Text = $"تغییر وضیعت چک شماره {NumCHECK}";
}
}
private void BtnSave_Click(object sender, EventArgs e)
{
try
{
using (UnitOfWork db = new UnitOfWork())
{
var Check = db.CheckTransactionRepositoryRubik.GetAll(p => p.IDCheckTransaction == Id).FirstOrDefault();
string name = Check.NAMEBankCheck;
decimal price = Check.PRICECheck;
string numbercheck = Check.NUMBERCheck;
DateTime datecheck = Check.DATECheck;
DateTime dateokcheck = Check.DATEOkCheck;
int idcustomer = Check.IDCustomerSet;
int type = Check.TYPETransaction;
string road = Check.DESCRIPTIONRoad;
DataLayer.CheckTransaction ch = new DataLayer.CheckTransaction()
{
NAMEBankCheck = name,
PRICECheck = price,
NUMBERCheck = numbercheck,
DATECheck = datecheck,
DATEOkCheck = dateokcheck,
IDCustomerSet = idcustomer,
TYPETransaction = type,
DESCRIPTIONRoad = road,
STATECheck = Statecheck,
};
ch.IDCheckTransaction = Id;
db.CheckTransactionRepositoryRubik.Edit(ch);
db.Save();
RtlMessageBox.Show("عملیات ثبت با موفقیت انجام شد", "موفقیت", MessageBoxButtons.OK);
}
}
catch
{
RtlMessageBox.Show("عملیات ثبت با خطا مواجه شد", "خطا", MessageBoxButtons.OK);
}
}
private void RBVosooli_CheckedChanged(object sender, EventArgs e)
{
if (RBVosooli.Checked == true)
{
Statecheck = "وصولی";
}
}
private void RBOk_CheckedChanged(object sender, EventArgs e)
{
if (RBOk.Checked == true)
{
Statecheck = "پاس شده";
}
}
private void RBNotOk_CheckedChanged(object sender, EventArgs e)
{
if (RBNotOk.Checked == true)
{
Statecheck = "پاس نشده";
}
}
private void RBBack_CheckedChanged(object sender, EventArgs e)
{
if (RBBack.Checked == true)
{
Statecheck = "برگشت به طرف حساب";
}
}
}
}
وکد ویرایش در entity بصورت زیر است :
public virtual void Edit(TEntity entity)
{
if (_db.Entry(entity).State == EntityState.Detached)
{
_dbset.Attach(entity);
}
_db.Entry(entity).State = EntityState.Modified;
}حالا بعد از اجرا و عمل ویرایش خطای زیر صادر میشود :
'Attaching an entity of type 'Accounting.DataLayer.CheckTransaction' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.'
با توجه به خطای فوق ظاهرا مشکل از این است که به کلیدی اصلی جدول مشکل خورده و میگه رکوردی که دارید ویرایش میکنید در حال استفاده است ولی من واقعا متوجه نشدم مشکل کجاست و چکار کنم چون جایی دیگه از کلید استفاده نکردم. ممنون میشم راهنمایی بفرمایید..
-----
سوال دیگری هم دارم که من در این کد در اصل فقط میخواهم فیلد StateCheck را ویرایش کنم ولی چون چندین فیلد غیر AllowNulls دارم و حتما باید در ویرایش مقدار دهی شوند چطور میتونم از مقداردهی اضافه بقیه فیلدها خودداری کنم و فقط همان یک فیلد را ویرایش کنم .
ممنون
ممنونم جناب مهندس
لینک رو بررسی کردم و مشکلم حل شد.
و اینکه اگر سوال دومم که در بالا خدمتتان عرض کردم و درباره ویرایش فقط یک فیلد از فیلدهای غیر null پذیر در بانک یا اینکه مثلا فقط یک فیلد که میخواهم ویرایش کنم تغییر کند و بقیه مقدار خودشان را بدون ویرایش مجدد داشته باشند را هم پاسخ بفرمایید ممنون میشوم. با تشکر
باید همه را مقدار دهی کنید اگر نمی خواهید میخواهید از ADO.Net استفاده کنید تا فقط ستون های مورد نظر ویرایش شوند