ADO.NETentity framework和标识列
entity framework是否知道标识列?
我正在使用SQL Server 2005速成版,并有几个主键是标识列的表。 当我使用这些表来创build一个实体模型,并将该模型与一个实体数据源绑定到一个formview以创build一个新的实体时,我被要求input一个标识列的值。 有没有办法让框架不要求身份列的值?
我知道这个post已经很老了,但是这可能会帮助下一个人通过Googlesearch“Entitiy Framework”和“Identity”。
看起来,entity framework确实尊重服务器生成的主键,如果设置了“标识”属性,情况就会如此。 但是,应用程序端模型仍然需要在CreateYourEntityHere
方法中提供主键。 此处指定的密钥在SaveChanges()
调用上下文时被丢弃。
这里的页面给出了关于这个的详细信息。
如果您正在使用entity framework5,则可以使用以下属性。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
您应该设置标识列的标识规范,以便将(是标识)属性设置为true。 你可以在SSMS的餐桌devise师那里做这个。 那么你可能需要更新实体数据模型。
也许这就是说“主键是一个标识列”,或者你错过了这一步。
这是我见过的最好的答案。 您必须手动编辑存储层xml以在UniqueIdentifier
types的每个主键(其默认值设置为NewID()
上设置StoreGeneratedPattern="Identity"
。
entity framework可以识别并处理标识列。
你的问题可能不是EF本身,而是生成的formview。 尝试从插入表单中删除标识列的input,让我们看看会发生什么。
如果一切都失败之前,你撕掉你的头发 – 尝试删除您的EntityModel并从SQL Server重新导入。 如果您一直在调整密钥和关系,并依靠“从数据库更新模型”function,它仍然是我发现的RC版本中的一个错误 – 新的导入可能会有所帮助。
在C#中,你可以做这样的事情,使其知道:
在你的FooConfiguration.cs : EntityTypeConfiguration<Foo>
:
this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
然后使用它,只要确保将该项插入到上下文中,并在使用x.foo
获取更新的自动递增值之前调用context.SaveChanges()
。 否则x.foo
将只是0或null。
由于某种原因,entity framework并不完全理解身份。 正确的解决方法是将该列的设置器设置为私有。 这将使任何生成的用户界面明白,它不应该设置身份值,因为它不可能设置私人领域。
我不相信。 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()
不pipe我做什么。 经过8个小时,包括删除我的模型,35次构build和重build,试验和编辑EDMX的XML,现在几乎要删除我的整个SQL Server数据库。 在第36次编译中,这个令人哭笑不得的解决scheme奏效了
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
尝试Intellisence listOfST后SaveChanges,你会发现更新的ID。 也许有更好的方法,但概念在那里
什么对我的工作是将StoreGeneratedPattern设置为无,当它是一个标识列。 现在一切工作一致。 与此相关的主要问题是编辑模型是一个极端的琐事,如果你有很多模型。