使用(ling to sql)更新错误

本文关键字:更新 错误 sql to ling 使用 | 更新日期: 2023-09-27 18:29:03

我有两个表,由外键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);
            }

使用(ling to sql)更新错误

我希望是这样的组合:

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

其然后从不加载CCD_ 1作为对象。