【问题标题】:Updating error using (ling to sql)使用(linq to sql)更新错误
【发布时间】:2012-03-27 19:02:51
【问题描述】:

我有两个表,由外键 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 中更新运营商名称时。我收到此错误“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);
            }

【问题讨论】:

  • 我还没有通读你的所有代码,但你可以记住的是,使用 Linq2SQL,你通常不需要自己设置任何 ID,只需添加对对象实例的引用.所以在你的情况下:vendor.Carrier = carrier 其中carrierCarrier 的一个实例,还将正确的CarrierID 添加到vendor。无需自己添加 ID。

标签: c# wpf linq-to-sql data-binding datacontext


【解决方案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 作为对象加载。

【讨论】:

  • 请再次检查代码,因为 'var carrier = context.Carriers.Single(x => x.Id = vendor.CarrierId); comVendorCarrier.Text = 运营商.CarrierName.Trim();'不适合我。
  • 这里有问题 'var carrier = context.Carriers.Single(x => x.Id = vendor.CarrierId); comVendorCarrier.Text = 运营商.CarrierName.Trim();'找不到 ID。
  • @ThivakaranSelvarajoo,代码无法编译,原因有两个:1. 你没有x.Id,但x.CarrierID,正如我在你的问题中看到的那样,2. =(分配) 应该是 == (equals) 'var carrier = context.Carriers.Single(x => x.CarrierID == vendor.CarrierID)`
  • @Marc Gravell,我仍然收到同样的错误“ForeignKeyReferenceAlreadyHasValueException”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多