C# 使用(ling到sql)更新错误
我有两个表,由外键CarrierID绑定:C# 使用(ling到sql)更新错误,c#,wpf,linq-to-sql,data-binding,datacontext,C#,Wpf,Linq To Sql,Data Binding,Datacontext,我有两个表,由外键CarrierID绑定: Carrier[CarrierID,CarrierName] CarrierID = 1, CarrierName = DHL CarrierID = 2, CarrierName = Fedex ... Vendor[VendorID, VendorName, CarrierID] VendorID = 1, VendorName =D-link , CarrierID=1 VendorID = 2, VendorName = Netbes
Carrier[CarrierID,CarrierName]
CarrierID = 1, CarrierName = DHL
CarrierID = 2, CarrierName = Fedex
...
Vendor[VendorID, VendorName, CarrierID]
VendorID = 1, VendorName =D-link , CarrierID=1
VendorID = 2, VendorName = Netbes , CarrierID= 2
当我尝试在vendorview中更新carriername时。我收到这个错误“ForeignKeyReferenceAlreadyHasValueException”
我有一门叫做editvendor的课
public static void editvendor(Vendor vendor)
{
using (MyinvoiceDataDataContext connv = new MyinvoiceDataDataContext())
{
Vendor editven = (from s in connv.Vendors
where s.VendorID == vendor.VendorID
select s).FirstOrDefault();
editven.VendorAddress = editven.VendorAddress;
editven.VendorBalance = editven.VendorBalance;
editven.VendorContactName = editven.VendorContactName;
editven.VendorEmail = editven.VendorEmail;
editven.VendorFax = editven.VendorFax;
editven.VendorName = editven.VendorName;
editven.VendorPaymentTerms = editven.VendorPaymentTerms;
editven.VendorPhone = editven.VendorPhone;
editven.VendorRemark = editven.VendorRemark;
editven.VendorTax = editven.VendorTax;
editven.VendorWebsite = editven.VendorWebsite;
editven.CarrierID = editven.Carrier.CarrierID;
connv.SubmitChanges();
}
}
#endregion
在windows窗体(编辑供应商窗体)中,我使用以下命令:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
MyinvoiceDataDataContext contecta = new MyinvoiceDataDataContext();
var tb = from s in contecta.Carriers
select new { s.CarrierID, s.CarrierName };
comVendorCarrier.ItemsSource = tb;
comVendorCarrier.DisplayMemberPath = "CarrierName";
comVendorCarrier.SelectedValuePath = "CarrierID";
ViewVendor vendview = new ViewVendor();
txtVendorName.Text = vendor.VendorName.Trim();
txtVendorBalance.Text = vendor.VendorBalance.Trim();
txtVendorContactName.Text = vendor.VendorContactName.Trim();
txtVendorPhone.Text = vendor.VendorPhone.Trim();
txtVendorFax.Text = vendor.VendorTax.Trim();
txtVendorEmail.Text = vendor.VendorEmail.Trim();
txtVendorWebsite.Text = vendor.VendorWebsite.Trim();
txtVendorRemarks.Text = vendor.VendorRemark.Trim();
txtVendorAddress.Text = vendor.VendorAddress.Trim();
txtVendorTax.Text = vendor.VendorTax.Trim();
comVendorCarrier.Text = vendor.Carrier.CarrierName.Trim();
ComVendorPaymentTerms.Text = vendor.VendorPaymentTerms.Trim();
}
此代码用于保存已编辑的供应商
private void EditVendorSavebtn_Click_1(object sender, RoutedEventArgs e)
{
int SelectedCarrierId = int.Parse(comVendorCarrier.SelectedValue.ToString());
if (txtVendorName.Text.Trim() == "")
MessageBox.Show("Please fill vendor's Name");
if (txtVendorBalance.Text.Trim() == "")
MessageBox.Show("Please fill vendor's balance");
if (txtVendorContactName.Text.Trim() == "")
MessageBox.Show("Please fill vendor's contact name");
if (txtVendorPhone.Text.Trim() == "")
MessageBox.Show("Please fill vendor's phone number");
if (txtVendorFax.Text.Trim() == "")
MessageBox.Show("Please fill vendor's fax number");
if (txtVendorEmail.Text.Trim() == "")
MessageBox.Show("Please fill vendor's E-maill");
if (txtVendorWebsite.Text.Trim() == "")
MessageBox.Show("Please fill vendor's Website");
if (txtVendorAddress.Text.Trim() == "")
MessageBox.Show("Please fill vendor's address");
else
{
vendor.VendorName = txtVendorName.Text.Trim();
vendor.VendorBalance = txtVendorBalance.Text.Trim();
vendor.VendorContactName = txtVendorContactName.Text.Trim();
vendor.VendorPhone = txtVendorPhone.Text.Trim();
vendor.VendorFax = txtVendorFax.Text.Trim();
vendor.VendorEmail = txtVendorEmail.Text.Trim();
vendor.VendorWebsite = txtVendorWebsite.Text.Trim();
vendor.VendorRemark = txtVendorRemarks.Text.Trim();
vendor.VendorAddress = txtVendorAddress.Text.Trim();
vendor.VendorPaymentTerms = ComVendorPaymentTerms.Text;
vendor.CarrierID = SelectedCarrierId;
vendor.VendorTax = txtVendorFax.Text.Trim();
vendorinfo.editvendor(vendor);
MessageBox.Show(vendor.VendorName + " succesfully edited.");
Window_Loaded(null, null);
}
我希望是这样的组合:
// somewhere
comVendorCarrier.Text = vendor.Carrier.CarrierName.Trim();
...
// somewhere else
vendor.CarrierID = SelectedCarrierId;
一种是使用面向对象的方法,另一种是使用基于id的方法-但是,如果两者都加载且不兼容,则会出现问题。我想知道您是否应该使用:
vendor.Carrier = null;
vendor.CarrierID = SelectedCarrierId;
那么,使用哪种载体就只有一个定义
或者,单独处理载体,例如,而不是:
comVendorCarrier.Text = vendor.Carrier.CarrierName.Trim();
使用:
它永远不会将
vendor.Carrier
作为对象加载。我还没有通读您的所有代码,但是您可以记住,使用Linq2SQL,您通常不需要自己设置任何ID,只需添加对对象实例的引用即可。因此,在您的情况下:vendor.Carrier=Carrier
,其中Carrier
是Carrier
的一个实例,还将正确的CarrierID
添加到供应商
。不需要自己添加Id。请再次检查代码,因为'var carrier=context.Carriers.Single(x=>x.Id=vendor.CarrierId);comVendorCarrier.Text=carrier.CarrierName.Trim();'不适合我。这里有问题'var carrier=context.Carriers.Single(x=>x.Id=vendor.CarrierId);comVendorCarrier.Text=carrier.CarrierName.Trim();'找不到Id。@Thivakaransevarajoo,代码将无法编译,原因有二:1。你没有x.Id
,但是x.CarrierID
,正如我在你的问题和2中看到的那样。=
(赋值)应该是=
(等于)'var carrier=context.Carriers.Single(x=>x.CarrierID==vendor.CarrierID)`@Marc gravel,我仍然收到相同的错误“ForeignKeyReferenceAlreadyHasValueException”
var carrier = context.Carriers.Single(x => x.Id = vendor.CarrierId);
comVendorCarrier.Text = carrier.CarrierName.Trim();