【问题标题】:Insert data in two Different tables on InsertOnSubmit() Using Linq asp.net c#在 InsertOnSubmit() 上使用 Linq asp.net c# 在两个不同的表中插入数据
【发布时间】:2013-03-05 08:34:49
【问题描述】:

我正在使用 asp.net c# 和 Mysql 进行在线购物项目。我正在使用 Devart Linqconnect (LinqtoMysql)。我在 mysql 客户和客户地址中有两个表:

客户表
客户 ID 整数
Customerhone varchar(20);
客户密码 Varchar(20);
电子邮件 varchar(20)
名字 char(50)
姓(50)
用户名 varshar(50)

客户地址
Customer_address_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Customer_ID INT NOT NULL,
地址1 CHAR(250),
地址2 CHAR(250),
城市 CHAR(20),
状态 CHAR(20), 密码 VARCHAR(20),
主键(客户地址 ID),
FOREIGN KEY (Customer_ID) REFERENCES customers(Customer_ID)

当我在使用 LINQ to mysql 注册客户时编写此代码时:

 using (ShoppingDataContext data = new ShoppingDataContext())
        {
            Customer NewCustomer = new Customer();
            CustomerAddress newaddress = new CustomerAddress();
            newaddress.CustomerID = NewCustomer.CustomerID;
            NewCustomer.CustomerFirstname = TextBoxFirstName.Text;
            NewCustomer.CustomerLastname = TextBoxLastname.Text;
            NewCustomer.CustomerEmail = TextBoxEmail.Text;
            NewCustomer.Username = TextBoxusername.Text;
            NewCustomer.CustomerPassword = TextBoxPassword.Text;
            newaddress.Address1 = TextBoxAddress1.Text;
            newaddress.Address2 = TextBoxAddress2.Text;
            newaddress.City = TextBoxCity.Text;
            newaddress.State = TextBoxState.Text;
            newaddress.Pincode = TextBoxPincode.Text;
            System.Web.Security.Membership.CreateUser(TextBoxusername.Text, TextBoxPassword.Text);
            data.Customers.InsertOnSubmit(NewCustomer);
            PanelRegister.Visible = false;
            ConfimPanel.Visible = true;

        }

此代码是否可以将数据插入到两个表中。请帮忙。 customer_address表能否根据customerId为外键,检测出输入的客户地址是customer表的?

我正在使用 ajax 工具包的模态弹出面板,并在面板中添加了注册和登录表。

我的注册面板:

提前谢谢...

【问题讨论】:

  • 我现在已经尝试过了,我收到了这个可怕的错误:视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保 配置指定相同的验证密钥和验证算法。 AutoGenerate 不能在集群中使用。
  • 抱歉问了这么长的问题..

标签: c# asp.net mysql database-design linq-to-sql


【解决方案1】:

我强烈建议您像这样组织代码:

 using (ShoppingDataContext data = new ShoppingDataContext())
 {
     Customer newCustomer = new Customer()
     {
         CustomerFirstname = TextBoxFirstName.Text,
         CustomerLastname = TextBoxLastname.Text,
         CustomerEmail = TextBoxEmail.Text,
         Username = TextBoxusername.Text,
         CustomerPassword = TextBoxPassword.Text
     };

     //now I'd like to be proven wrong here, but I believe you need to insert
     //and submit at this point
     data.Customers.InsertOnSubmit(newCustomer);
     data.SubmitChanges();

     CustomerAddress newaddress = new CustomerAddress()
     {
          CustomerID = NewCustomer.CustomerID,
          Address1 = TextBoxAddress1.Text,
          Address2 = TextBoxAddress2.Text,
          City = TextBoxCity.Text,
          State = TextBoxState.Text,
          Pincode = TextBoxPincode.Text,
     };
     //add new address to your customer and save
     newCustomer.CustomerAddresses.Add(newAddress);
     //it has been a while since I used linq2sql so you may need one of these:
     //newCustomer.CustomerAddresses.InsertOnSubmit(newAddress);
     //newCustomer.CustomerAddresses.Attach(newAddress);
     //basically use intellisense to help you figure out the right one, you might
     //have some trial and error here
     data.SubmitChanges();

     System.Web.Security.Membership.CreateUser(TextBoxusername.Text, TextBoxPassword.Text);

     PanelRegister.Visible = false;
     ConfimPanel.Visible = true;

  }

另外,请注意 insert 和 db.SubmitChanges() 移动到的位置。现在我不确定您是否可以使用一个 SubmitChanges() 一次性完成此操作,或者您是否需要如图所示的两个。我希望您能提供有关这方面的最新信息。

您可以在这里查看一个简单的插入示例:

http://msdn.microsoft.com/en-us/library/bb386941.aspx

编辑:您可能希望将这一切都包装在事务范围中,以便它作为一个单元成功或失败

using(TransactionScope scope = new TransactionScope())
{
  using(ShoppingDataContext data = new ShoppingDataContext())
  {
    //the rest of your code
  }
}

只是一个想法。

【讨论】:

  • C: 数据插入到 MySql My_aspnet_users 表中,但不在客户表和 CustomerAddresses 表中。在 newCustomer.Address = newaddress;错误:它不包含 newCustomer.Address 的定义,请帮助..
  • 我只是猜到了 newCustomer.Address。您需要查看您的对象并查看实际导航属性的用途。我无法知道它是什么。如果您的 Customer 对象没有您可以设置的 Address 属性,请告诉我。
  • 有一个“NewCustomer.CustomerAddresses”的属性,但 CustomerAddresses 是一个实体集。我将改写我的问题,因为我只想将客户信息(不是地址信息)存储在客户表中,但将注册面板的地址信息存储到地址表中,但仅使用客户的 ID 来引用客户
  • linq2sql 创建两个表之间的关联,由 newCustomer.CustomerAddresses 表示。如果您调用 newCustomer.CustomerAddresses.InsertOnSubmit(newAddress) 它知道您的意思是 customeraddresses 表,并在您调用 submitchanges() 时将其插入并自动将其与您添加到的客户相关联。我将在我的答案中编辑代码。
  • 非常感谢您的指导。非常感谢您的帮助
【解决方案2】:

看来你必须先在Customer Table 中插入一条记录,然后再在Customer_Addresses 中插入一条记录,这样db 引擎才能找到外键

【讨论】:

    【解决方案3】:

    如果你从自己的代码中看一行,

    data.Customers.InsertOnSubmit(NewCustomer);
    

    这告诉您InsertOnSubmitInsertAllOnSubmit 在单个表上被调用的故事。我自己没有尝试过,但您可以解决并制定自己的方法来为您执行此操作。

    尽管正如 Pablo Lemurr 所提到的,您需要先添加客户记录,然后再添加地址记录,因为它引用了外键。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      相关资源
      最近更新 更多