我创建了一个包含此架构的表:
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')
你知道什么是错的吗?
感谢您的帮助。
答案 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( );
}
}