2012-03-27 126 views
0

我有两个表,通过外键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 , 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); 
      } 
+2

我还没有通读所有的代码,但你可以记住的是,使用Linq2SQL你通常不需要自己设置任何ID,只需添加一个对象实例的引用即可。因此,在你的情况下:'vendor.Carrier = carrier',其中'carrier'是'Carrier'的一个实例,同时也向'vendor'添加了正确的'CarrierID'。无需自己添加ID。 – Bazzz 2012-03-27 08:12:18

回答

1

我期望它是这种组合:

// 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(); 

使用:

var carrier = context.Carriers.Single(x => x.Id = vendor.CarrierId); 
comVendorCarrier.Text = carrier.CarrierName.Trim(); 

然后从未加载vendor.Carrier作为对象。

+0

请检查代码,因为'var carrier = context.Carriers.Single(x => x.Id = vendor.CarrierId); comVendorCarrier.Text = carrier.CarrierName.Trim();'不为我工作。 – 2012-03-27 10:25:42

+0

@ThivakaranSelvarajoo定义“不工作” - 会发生什么? – 2012-03-27 13:04:09

+0

这里有问题'var carrier = context.Carriers.Single(x => x.Id = vendor.CarrierId); comVendorCarrier.Text = carrier.CarrierName.Trim();' Id不能被发现。 – 2012-03-27 13:48:50