System.InvalidOperationException:无法对"表(序列号)"执行创建、更新或删除操作,因为它没有主键



目前,我正在尝试使用LINQ连接到第三方数据库,以向保存序列号的表添加值。然而,当我试图运行我的程序时,问题标题的错误将弹出。

当前,程序执行此命令失败:

string STRout = foo.AccountInfo(email, serialNum, "TEST2");
进入accountInfo方法,调用serialNumber方法的行如下(其当前位置用于测试目的):
this.newSerialNumber(serialNum);

最后,newSerialNumber方法如下所示:

[WebMethod]
    public bool newSerialNumber(string serialNum)
    {
        SerialNumbers new_SN = new SerialNumbers();
        //serialNumber is the primary key in the SerialNumbers table
        new_SN.SerialNumber = serialNum;
        new_SN.Count = 1;
        linqQueries.SerialNumbers.InsertOnSubmit(new_SN);
        linqQueries.SubmitChanges();
        return true;
    }

这段代码是从已经工作的代码派生出来的,其内容如下:

[WebMethod]    
public bool CustomerInfo(string DealershipName, string DealershipEmail, string DealershipAddress, string Name, string DealershipNumber, string DealershipPhone, string serialNumber, string registrationNum)
    {
        //Add the new customer to the table
        CustomerInformation newCustomer = new CustomerInformation();
        newCustomer.DealershipName = DealershipName;
        newCustomer.DealershipEmail = DealershipEmail;
        newCustomer.DealershipAddress = DealershipAddress;
        newCustomer.Name = Name;
        newCustomer.DealershipNumber = DealershipNumber;
        newCustomer.DealershipPhone = DealershipPhone;
        linqQueries.CustomerInformations.InsertOnSubmit(newCustomer);
        linqQueries.SubmitChanges();
        //string activateCode = getActivation(registrationNum);
        CustomerAccount newAccount = new CustomerAccount();
        newAccount.SerialNumber = serialNumber;
        newAccount.DealershipEmail = DealershipEmail;
        newAccount.RegistrationNumber = registrationNum;
        newAccount.CustomerInformation = newCustomer;
        linqQueries.CustomerAccounts.InsertOnSubmit(newAccount);
        linqQueries.SubmitChanges();
        return true;
    }

除了serialNumber值是SerialNumbers表中的主键外,它还作为唯一值列出。

是我错过了什么,还是有某种我不知道的异常的解决方法?

更新:找到答案了。结果表明,程序在整个过程中都没有将SerialNumber标识为主键。在再次查看此答案后,我决定在解决方案中查找"IsPrimaryKey"。事实证明,在处理数据库表的解决方案中,我完全遗漏了一个文件。SerialNumbers表代码如下:

<Table Name="dbo.SerialNumbers" Member="SerialNumbers">
<Type Name="SerialNumbers">
  <Column Member="SerialNumber" Type="System.String" CanBeNull="false" />
  <Column Member="Count" Type="int" CanBeNull="false" />
</Type>

在我注意到这一点之后,解决方案变得显而易见。

<Column Member="SerialNumber" Type="System.String" CanBeNull="false" />

应该是

 <Column Member="SerialNumber" Type="System.String" IsPrimaryKey="true" CanBeNull="false" />

这个快速的改变修复了这个问题。

注:当使用第三方数据库时,请确保数据库上的dll文件是最新的!如果不这样做,可能会导致程序不能按预期运行。

最新更新