使用(ling to sql)更新错误 [英] Updating error using (ling to sql)

查看:133
本文介绍了使用(ling to sql)更新错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两张表,由外键绑定CarrierID:

 运营商[CarrierID,CarrierName] 
CarrierID = 1,CarrierName = DHL
CarrierID = 2,CarrierName = Fedex
...
供应商[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())
{

供应商editven = s in connv.Vendors
其中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 cont 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(请填写供应商名称);

if(txtVendorBalance.Text.Trim()==)
MessageBox.Show(请填写供应商的余额);

if(txtVendorContactName.Text.Trim()==)
MessageBox.Show(请填写供应商的联系人姓名);

if(txtVendorPhone.Text.Trim()==)
MessageBox.Show(请填写供应商的电话号码);

if(txtVendorFax.Text.Trim()==)
MessageBox.Show(请填写供应商的传真号码);

if(txtVendorEmail.Text.Trim()==)
MessageBox.Show(请填写供应商的E-maill);

if(txtVendorWebsite.Text.Trim()==)
MessageBox.Show(请填写供应商的网站);

if(txtVendorAddress.Text.Trim()==)
MessageBox.Show(请填写供应商地址);

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 +成功编辑);
Window_Loaded(null,null);
}


解决方案

我期望是这种组合:

  //某处
comVendorCarrier.Text = vendor.Carrier.CarrierName.Trim();
...
//其他地方
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 as一个对象。


I have two tables, binded by foreign key 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

When i try to update the carriername in vendorview. Im getting this error "ForeignKeyReferenceAlreadyHasValueException"

I have class called 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

In the windows form(edit vendor form) i use this:

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

This code i use to save the edited vendor

 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);
            }

解决方案

I expect it is this combination:

// somewhere
comVendorCarrier.Text = vendor.Carrier.CarrierName.Trim();
...
// somewhere else
vendor.CarrierID = SelectedCarrierId;

One is using the object-oriented approach, one is using the id-based approach - however, if both are loaded and are incompatible, problems. I wonder if you should use:

vendor.Carrier = null;
vendor.CarrierID = SelectedCarrierId;

then there is exactly one definition of which carrier to use.

Alternatively, handle the carrier separately, for example, instead of:

comVendorCarrier.Text = vendor.Carrier.CarrierName.Trim();

use:

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

which then never loads vendor.Carrier as an object.

这篇关于使用(ling to sql)更新错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆