System.InvalidOperationException:无法在'表(SerialNumbers)'上执行创建,更新或删除操作。因为它没有主键

时间:2015-10-22 21:02:20

标签: c# .net sql-server database linq

目前,我正在尝试使用LINQ连接到第三方数据库,以便将值添加到包含序列号的表中。但是,当我尝试运行程序时,会弹出问题标题的错误。

目前,程序在此命令上失败:

this.newSerialNumber(serialNum);

进入accountInfo方法,调用serialNumber方法的行如下(其当前位置用于测试目的):

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

最后,newSerialNumber方法如下所示:

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

此代码源自已经工作的代码,其内容如下:

public class User {
   public int ID { get; set; }
   public string Name { get; set; }
   public City City { get; set; }
   public Office Office { get; set; }
}

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

我是否遗漏了某些内容,或者在这种情况下是否存在某种解决方法,我在这种情况下并未意识到这一点?

1 个答案:

答案 0 :(得分:0)

更新:找出答案。事实证明,该程序并未将SerialNumber始终识别为主键。在再次查看this回答之后,我决定在解决方案中寻找“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" />

这一快速修改解决了这个问题。

P.S。使用第三方数据库时,请确保将数据库中的dll文件保持最新!如果不这样做可能会导致程序无法按预期运行。