49

实体框架是否知道标识列?

我正在使用 SQL Server 2005 Express Edition,并且有几个表,其中主键是标识列。当我使用这些表来创建实体模型并将模型与实体数据源结合使用以创建新实体时,我被要求为标识列输入一个值。有没有办法让框架不要求身份列的值?

4

10 回答 10

66

我知道这篇文章已经很老了,但这可能有助于下一个到达的人通过谷歌搜索“实体框架”和“身份”来听到。

似乎实体框架确实尊重服务器生成的主键,如果设置了“身份”属性就是这种情况。但是,应用程序端模型仍然需要在方法中提供主键CreateYourEntityHereSaveChanges()此处指定的键在调用上下文时被丢弃。

此处的页面提供了有关此的详细信息。

于 2008-12-23T09:46:41.057 回答
5

如果您使用的是 Entity Framework 5,则可以使用以下属性。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
于 2013-07-19T03:01:41.357 回答
4

You should set the identity columns' identity specification so that the (Is Identity) property is set to true. You can do this in your table designer in SSMS. Then you may need to update the entity data model.

Perhaps that what you mean by saying the "Primary key is an identity column," or perhaps you missed this step.

于 2008-09-23T16:28:14.413 回答
3

这是我见过的最好的答案。您必须手动编辑存储层 xml 以StoreGeneratedPattern="Identity"在每个类型的主键上UniqueIdentifier设置默认值设置为NewID().

http://web.archive.org/web/20130728225149/http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

于 2011-06-08T16:28:27.420 回答
2

实体框架知道并且可以处理标识列。

您的问题可能不是 EF 本身,而是它生成的表单视图。尝试从插入表单中删除标识列的输入,让我们看看会发生什么。

于 2008-09-23T12:48:40.637 回答
2

如果在你扯掉头发之前一切都失败了 - 尝试删除你的 EntityModel 并从 SQL Server 重新导入。如果您一直在调整键和关系并依赖“从数据库更新模型”功能,那么在我发现的 RC 版本中它仍然有点错误 - 新的导入可能会有所帮助。

于 2008-09-25T18:33:13.893 回答
2

在 C# 中,您可以执行以下操作以使其知道:

在你的FooConfiguration.cs : EntityTypeConfiguration<Foo>

this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

然后要使用它,只需确保将项目插入上下文并context.SaveChanges()在使用之前调用x.foo以获取更新的自动递增值。否则x.foo将只是 0 或 null。

于 2013-03-19T15:42:04.837 回答
1

由于某种原因,实体框架不能完全理解身份。正确的解决方法是将该列的 Setter 设置为 Private。这将使任何生成的 UI 明白它不应该设置标识值,因为它不可能设置私有字段。

于 2009-01-06T07:09:08.747 回答
0

对我有用的是将 StoreGeneratedPattern 设置为 None,当它是一个 Identity 列时。现在这一切都在一致地工作。这样做的主要问题是,如果你有很多模型,编辑模型是一件非常麻烦的事。

于 2011-03-23T14:50:21.780 回答
0

我不相信。智能感知 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 yield 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。也许有更好的方法,但概念就在那里

于 2012-03-31T17:58:02.597 回答