Sql server 不返回标识的编程实体框架示例
我的目标是从Visual Studio 11 Beta(2012年5月26日)的最新版本升级一个用VBscript编写的旧的90年代经典ASP应用程序,使用Access作为后端,将其升级到带有实体框架(EF)的MVC3 Razor页面,该页面使用SQL Server后端。最终,我们将把应用程序从客户端服务器移到云上,然后移到Azure上 从ground zero的知识开始,我尝试在Windows 7笔记本电脑上的控制台应用程序和LinqPad(开发和测试查询的一种非常快速、方便、简单的方法:-)中使用EF示例的基本介绍 Julia Lerman第一版编程实体框架第130页上的脱离极客冒险(BAGA)演示似乎是一个很好的起点。我对自跟踪实体、附加和分离、AutoMapper和实体框架的其他方面不太了解,但我知道基本的介绍不应该让我想把使用微软EF的想法一扫而光,然后转到Ruby on Rails ActiveRecord和Amazon Web Services(AWS)上的LAMP stack 下面的C#EF示例片段来自一位公认的专家,应该非常简单。。。不幸的是,堆栈溢出中包含“maybe”和“maybe”的答案过多,这表明EF通常没有得到很好的理解 例如,对MSDN的引用没有帮助 尽管MSDN表示EF支持服务器在 我不相信这些,因为当我将行/记录/实体添加到实体集/表中时,联系人的身份不会在EF中返回,从而导致依赖于ContactID的后续插入失败 没有给出很多关于调试的提示。在勒曼女士的第一版和第二版之间,EF的基本原理会有这么大的变化吗?当我告诉她我的新小狗开始吃我新买的第一版时,她确实建议我把它还给它,并给她买一些新的书 还有其他人有这个问题吗?问题可能在椅子和键盘之间的某个地方,因为我是坐短途公共汽车长大的。希望这里有足够的信息来复制这个问题或给出一些调试提示 联系人表在数据库中定义了一个自动递增的主键。以下是T-SQL:Sql server 不返回标识的编程实体框架示例,sql-server,entity-framework-4,azure,identity-column,savechanges,Sql Server,Entity Framework 4,Azure,Identity Column,Savechanges,我的目标是从Visual Studio 11 Beta(2012年5月26日)的最新版本升级一个用VBscript编写的旧的90年代经典ASP应用程序,使用Access作为后端,将其升级到带有实体框架(EF)的MVC3 Razor页面,该页面使用SQL Server后端。最终,我们将把应用程序从客户端服务器移到云上,然后移到Azure上 从ground zero的知识开始,我尝试在Windows 7笔记本电脑上的控制台应用程序和LinqPad(开发和测试查询的一种非常快速、方便、简单的方法:-)
var newcontact = context.Contact.CreateContact(0, "Julio", "Bartowski", DateTime.Now, DateTime.Now, null);
var nAddr = Address.CreateAddress(0, "Home", 0, DateTime.Now, null);
nAddr.Contact = newcontact;
nAddr.Dump();
var newaddress = new Address(){
Street1 = "5907 Hollow Oak Ct",
City = "Burke",
StateProvince = "VA",
CountryRegion = "US",
PostalCode = "22015",
AddressType = "Home",
ModifiedDate = DateTime.Now
};
newaddress.Contact = newcontact;
this.AddToContacts(newcontact); //I get an error here when new Addresses are waiting for the ContactID value.
this.SaveChanges();
newcontact.Dump();
地址表的ContactID与上述联系人表具有外键关系
CREATE TABLE [dbo].[Contact](
[ContactID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[Title] [nvarchar](50) NULL,
[AddDate] [datetime] NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
[RowVersion] [timestamp] NOT NULL,
CONSTRAINT [PK_Contact] PRIMARY KEY CLUSTERED
(
[ContactID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
测试表及其关系:
CREATE TABLE [dbo].[Address](
[addressID] [int] IDENTITY(1,1) NOT NULL,
[Street1] [nvarchar](50) NULL,
[Street2] [nvarchar](50) NULL,
[City] [nvarchar](50) NULL,
[StateProvince] [nvarchar](50) NULL,
[CountryRegion] [nvarchar](50) NULL,
[PostalCode] [nvarchar](50) NULL,
[AddressType] [nvarchar](50) NOT NULL,
**[ContactID] [int] NOT NULL**,
[ModifiedDate] [datetime] NOT NULL,
[RowVersion] [timestamp] NOT NULL,
CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED
(
[addressID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Address] WITH CHECK ADD CONSTRAINT [FK_Address_Contact] FOREIGN KEY([ContactID])
REFERENCES [dbo].[Contact] ([ContactID])
GO
ALTER TABLE [dbo].[Address] CHECK CONSTRAINT [FK_Address_Contact]
GO
INSERT语句与外键约束“FK_Address_Contact”冲突。冲突发生在数据库“BreakAway”、表“dbo.Contact”、列“ContactID”中。
声明已终止
DECLARE @ContactID int
INSERT INTO [dbo].[Contact]
([FirstName]
,[LastName]
,[Title]
,[AddDate]
,[ModifiedDate])
VALUES
('Julio', 'Bartowski', 'Mr.', GETDATE(), GETDATE() )
SET @ContactID = SCOPE_IDENTITY()
PRINT @ContactID
-- this works
INSERT INTO [dbo].[Address]
([Street1]
,[Street2]
,[City]
,[StateProvince]
,[CountryRegion]
,[PostalCode]
,[AddressType]
,[ContactID]
,[ModifiedDate])
VALUES
( '5907 Hollow Oak Ct', 'Suite 1400', 'Burke', 'VA', 'US', '22015', 'Office', @ContactID, GETDATE())
--this raises a referential integrity error (as it should) because there is no Contact with ContactID = 99999
INSERT INTO [dbo].[Address]
([Street1]
,[Street2]
,[City]
,[StateProvince]
,[CountryRegion]
,[PostalCode]
,[AddressType]
,[ContactID]
,[ModifiedDate])
VALUES
( 'BadRef Way', '13th Floor', 'Manhattan', 'NY', 'US', '10004', 'Office', 99999, GETDATE())
GO
我假设中描述的SSDL错误已经修复。以防万一,从my Entity Framework ADO.NET实体数据模型BAModel.EDMX文件中提取的内容显示,ContactID在存储架构定义语言和概念架构定义语言中都是一个自动递增的密钥标识:
--show the correct inserts worked fine in T-SQL.
SELECT * FROM Contact c
LEFT OUTER JOIN Address a
ON c.ContactID = a.ContactID
WHERE c.FirstName LIKE '%Julio%'
我还在一个控制台应用程序中尝试了这个演示,结果类似
实体框架不检索新的ContactID标识。SaveChanges()之后,ContactID保持为0,并且依赖于ContactID的地址插入随后失败
我做错了什么?为什么我下面简单的教学例子不起作用
var context = this;
context.Contacts
.Include("Addresses")
.OrderByDescending(x => x.ContactID)
.Take(3)
//.Single() //only works if you Take(1)
.Dump();
根据Julia的书,newcontact应该在SaveChanges()之后更新,在加载新主键的情况下,从EntityState“Added”变为“Unchanged”。不幸的是,上面的第一个newcontact.Dump()显示的内容与最后一个newcontact.Dump()显示的内容相同:ContactID=0
var context = this;
var newcontact = new Contact(){
FirstName = "Julio",
LastName = "Bartowski",
Title = "Mr.",
AddDate = DateTime.Now,
ModifiedDate = DateTime.Now
};
newcontact.Dump(); //show the entity object before saving to the database
context.AddToContacts(newcontact);
context.SaveChanges();
newcontact.Dump(); //show the entity object after saving to the database
LinqPad给了我一个更新异常:更新条目时出错。有关行上下文的详细信息,请参见内部异常。AddToContacts(newcontact)
原始值InvalidOperationException表示此ObjectStateEntry没有原始值。处于添加或分离状态的对象不能具有原始值
RuntimeMethodInfo是EntityEntry.InternalGetOriginalValues(布尔只读)
名称InternalGetOriginalValues
DeclaringType类型(EntityEntry)反射类型类型(EntityEntry)
成员类型方法 MetadataToken 100678288 模块4运行时模块4
System.Data.Entity.dll 是否安全关键错误 IsSecuritySafiticalFalse 是否安全透明 MethodHandle 4运行时MethodHandle 4
System.RuntimeMethodHandle 属性PrivateScope、Private、隐藏显示 呼叫会议标准,有这个吗 返回类型类型(DbDataRecord)
ReturnTypeCustomAttributes 4RuntimeParameterInfo 4
System.Data.Common.DbDataRecord ReturnParameter 4RuntimeParameterInfo 4
System.Data.Common.DbDataRecord IsGenericMethod False IsGenericMethodDefinition错误 包含通用参数False 方法实现标志IL 公开虚假 绝对正确 家庭是假的吗 我完全错了 Family和Dassembly是假的吗 FamilyOrassembly是假的吗 假假假 这是最终的错误吗 真的假的吗 真的吗 完全错误 IsSpecialName是假的吗 IsConstructor False CustomAttributes 4只读集合4
请,有人有一个简单的答案,我的“简单”的问题,他们知道的工作 EF绝对支持服务器生成的标识密钥,EF3.5和EF4之间有一个巨大的区别,即添加了外键支持。实体之间的关联发生了巨大的变化。如果没有正确定义关联,则无法正常工作。但我很难弄清楚问题出在哪里。信息太多,无法浏览。在VS11中。您可以使用entityobjects(第一版关注的对象)或行为非常不同的POCO。另外,在第一版和第二版的书中,tehre有一整章叫做处理异常(注释长度限制)。为什么不做一些基本的程序员调试呢。例如,只需添加联系人并保存更改。成功了吗?正如我在推特上说的,因为
var context = this;
var newcontact = new Contact(){
FirstName = "Julio",
LastName = "Bartowski",
Title = "Mr.",
AddDate = DateTime.Now,
ModifiedDate = DateTime.Now
};
newcontact.Dump(); //show the entity object before saving to the database
context.AddToContacts(newcontact);
context.SaveChanges();
newcontact.Dump(); //show the entity object after saving to the database
Contact
BAGA.Contact
<dl><dt>ContactID</dt><dd>0</dd></dl>
FirstName Julio
LastName Bartowski
Title null
AddDate 5/27/2012 8:07:11 PM
ModifiedDate 5/27/2012 8:07:11 PM
RowVersion null
var context = this;
var newcontact = context.Contact.CreateContact(0, "Julio", "Bartowski", DateTime.Now, DateTime.Now, null);
var nAddr = Address.CreateAddress(0, "Home", 0, DateTime.Now, null);
nAddr.Contact = newcontact;
nAddr.Dump();
var newaddress = new Address(){
Street1 = "5907 Hollow Oak Ct",
City = "Burke",
StateProvince = "VA",
CountryRegion = "US",
PostalCode = "22015",
AddressType = "Home",
ModifiedDate = DateTime.Now
};
newaddress.Contact = newcontact;
this.AddToContacts(newcontact); //I get an error here when new Addresses are waiting for the ContactID value.
this.SaveChanges();
newcontact.Dump();