实体框架是否了解标识列?
我正在使用SQL Server 2005 Express Edition并且有几个表,其中主键是标识列。当我使用这些表来创建实体模型并将模型与实体数据源绑定结合使用到formview以创建新实体时,我被要求输入标识列的值。有没有办法让框架不要求身份列的值?
答案 0 :(得分:67)
我知道这篇文章很老了,但这可能有助于下一个到达的人通过谷歌搜索“Entitiy Framework”和“Identity”。
似乎Entity Frameworks确实尊重服务器生成的主键,因为如果设置了“Identity”属性就是这种情况。但是,应用程序端模型仍需要在CreateYourEntityHere
方法中提供主键。此处指定的密钥在SaveChanges()
调用上下文时将被丢弃。
页面here提供了有关此内容的详细信息。
答案 1 :(得分:5)
如果您使用的是Entity Framework 5,则可以使用以下属性。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
答案 2 :(得分:4)
您应该设置标识列的标识规范,以便将(Is Identity)属性设置为true。您可以在SSMS中的表设计器中执行此操作。然后,您可能需要更新实体数据模型。
也许你说“主键是一个标识栏”是什么意思,或者你错过了这一步。
答案 3 :(得分:3)
这是我见过的最佳答案。您必须手动编辑存储层xml,以便在StoreGeneratedPattern="Identity"
类型的每个主键上设置UniqueIdentifier
,其默认值设置为NewID()
。
答案 4 :(得分:2)
实体框架知道并且可以处理标识列。
您的问题可能不是EF本身,而是生成的形式视图。尝试从插入表单中删除标识列的输入,让我们看看会发生什么。
答案 5 :(得分:2)
如果在撕掉你的头发之前所有其他方法都失败了 - 请尝试删除你的EntityModel并从SQL Server重新导入。如果你一直在调整键和关系,并依赖于“数据库中的更新模型”功能,那么在我发现的RC版本中仍然有点错误 - 一个全新的导入可能有所帮助。
答案 6 :(得分:2)
在C#中你可以做这样的事情让它知道:
在FooConfiguration.cs : EntityTypeConfiguration<Foo>
:
this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
然后要使用它,只需确保将项插入上下文并在使用context.SaveChanges()
之前调用x.foo
以获取更新的自动递增值。否则x.foo
将只是0或null。
答案 7 :(得分:1)
由于某种原因,实体框架无法完全理解身份。正确的解决方法是将该列的Setter设置为Private。这将使任何生成的UI都明白它不应该设置标识值,因为它不可能设置私有字段。
答案 8 :(得分:0)
对我来说有用的是将StoreGeneratedPattern设置为None,当它是Identity列时。现在一切都运作良好。这个问题的主要问题是,如果您有许多模型,编辑模型是一项极其繁琐的工作。
答案 9 :(得分:0)
我无法相信。 Intellisensing ItemCollection在SaveChanges之后产生ID = 0的单个项目。
Dim ItemCollection = From d In action.Parameter
Select New STOCK_TYPE With {
.Code = d.ParamValue.<Code>.Value,
.GeneralUseID = d.ParamValue.<GeneralUse>.Value,
}
GtexCtx.STOCK_TYPE.AddObject( ItemCollection.FirstOrDefault)
GtexCtx.SaveChanges()
无论我做什么。包括删除我的模型8小时后,35次构建和重建,试验和编辑EDMX的XML,现在几乎要删除我的整个SQL Server数据库。在第36次编译时,这个令人哭笑不得的解决方案起作用了
Dim abc = ItemCollection.FirstOrDefault
GtexCtx.STOCK_TYPE.AddObject(abc)
GtexCtx.SaveChanges()
abc.ID产量41(我需要的身份)
编辑:这是一个简单的思考代码,用于循环AddObject并仍然获得ID
Dim listOfST As List(Of STOCK_TYPE) = ItemCollection.ToList()
For Each q As STOCK_TYPE In listOfST
GtexCtx.STOCK_TYPE.AddObject(q)
Next
GtexCtx.SaveChanges()
...more code for inter-relationship tables
在SaveChanges之后尝试Intellisence listOfST,您将找到更新的ID。也许有更好的方法,但概念就在那里