EF在其SQL语句中不接受我的主键

时间:2014-03-15 09:08:18

标签: entity-framework

我创建了一个包含此架构的表:

CREATE TABLE [dbo].[A](
[KeyID] [uniqueidentifier] NOT NULL,
[OtherID] [uniqueidentifier] NULL,
[Info] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_TX_A] PRIMARY KEY CLUSTERED 
(
    [KeyID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我创建了这个POCO类:

public partial class A
{
    public A()
    {
    }

    public System.Guid KeyID { get; set; }
    public Nullable<System.Guid> OtherID{ get; set; }
    public string Info{ get; set; }
}

当我尝试使用Entity Framework在我的表中插入一个新行时:

[TestMethod]
public void TestAdd( )
{
A a = new A( );
Guid myKey = Guid.Parse("9B3CA1AC-279F-48CE-B693-D5329FF3AD14");

a.OtherID = myKey;
a.KeyID = myKey;
a.Info = "Test";

using( var database = new myConnection( ) )
{
    database.A.Add( a );
    database.SaveChangesAsync( ).Wait( );
}    
}

它生成此SQL命令:

DECLARE @generated_keys table([A] uniqueidentifier)
INSERT [dbo].[A]([OtherID], [Info])
OUTPUT inserted.[KeyID] INTO @generated_keys
VALUES (@0, @1)
SELECT t.[KeyID]
FROM @generated_keys AS g JOIN [dbo].[A] AS t ON g.[KeyID] = t.[KeyID]
WHERE @@ROWCOUNT > 0

然后它会生成此错误:

  

无法将值NULL插入列'KeyID',表'A.此列不接受NULL值。 INSERT失败。

它似乎没有考虑指定的主键ID,似乎认为主键是自动递增的。

但是这个SQL语句在SQL Server中运行良好:

INSERT INTO A (KeyID, OtheriD, Info) 
VALUES('9B3CA1AC-279F-48CE-B693-D5329FF3AD14', '9B3CA1AC-279F-48CE-B693-D5329FF3AD14', 'test')

你知道什么是错的吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的实体框架配置是为数据库生成的主键列设置的,这就是为什么您还在SQL中看到EF如何尝试检索新的KeyID值,即使它尚未设置它。您的主键列不是由数据库生成的,因此这永远不会起作用。

如果让EF为您生成数据库,您将获得匹配的数据库。如果手动创建数据库,它必须与EF认为应该匹配的数据库匹配,否则会出现这样的错误。

您可以让模型不将关键列视为使用DatabaseGenerated属性生成的数据库,并指定DatabaseGeneratedOption.None

答案 1 :(得分:0)

使用此代码:

public void TestAdd( )
{
   A a = new A( );
   Guid myKey = Guid.NewGuid();//use this

   a.OtherID = myKey;
   a.KeyID = myKey;
   a.Info = "Test";

   using( var database = new myConnection( ) )
   {
      database.A.Add( a );
      database.SaveChangesAsync( ).Wait( );
   }    
 }