当前位置: 首页 > 编程语言 > C#

如何通过Entity框架为Oracle数据库自动生成标识符?分享

时间:2023-04-10 21:36:51 C#

如何通过Entity框架自动为Oracle数据库生成标识符?我在使用Oracle提供者实体框架(测试版)时遇到了问题。我们的表有Id列,在StoreGeneratedPattern中设置为Identity。我认为EF会自动完成“基本工作”,比如创建序列,并为我添加到表中的每条记录获取一个新ID。但是当我运行代码来添加一条新记录时,如:context.Comments.AddObject(评论);context.SaveChanges();仍然会抛出异常,即{"ORA-00001:uniqueconstraint(ADMINMGR.CONSTRAINT_COMMENT)"}(CONSTRAINT_COMMENT是一个约束,要求评论id必须是唯一的。我该如何解决这个问题?非常感谢!StoreGeneratedPattern="Identity"只是告诉EF该值将在插入数据库端生成,它不应在插入语句中提供该值。您仍然需要在Oracle中创建序列:createsequenceComplaintIdSequenceminvalue1maxvalue9999999startwith1incrementby1;和使表插入的触发器使用它:在插入之前创建或替换触发器ComplaintIdTrigger对每一行的评论开始如果:新。ComplaintId为null然后选择ComplaintIdSequence.nextvalinto:new.ComplaintIdfromdual;万一;结尾;另一种选择是:按照Alextansc的描述创建序列。创建一个使用MySequence.nextval作为主键的存储过程。将此模型的“插入”映射到您的存储过程并且它有效!我使用数据库优先方法对此进行了测试。使用数据库优先映射到存储过程非常简单。转到edmx文件,右键单击要映射到存储过程的模型。单击存储过程映射。页面底部的对话框提供了三个下拉菜单,用于将插入、更新和删除映射到存储过程。我正在使用OracleODP.NET、托管驱动程序和实体框架6。我使用代码优先方法创建了我的表,但由于主键为空而无法添加任何记录。解决方案是授予我的用户:“创建序列”和“创建触发器”权限并重新创建架构。在包管理控制台中使用-verbose标志后,我意识到了这一点,而不是记住所有这些SQL,您可以像这样轻松地使用Mig#:varschema=newDbSchema(ConnectionString,DbPlatform.Oracle12c);schema.Alter(db=>db.CreateTable("TableName").WithPrimaryKeyColumn("Id",DbType.Int32).AsIdentity()...);在此示例中,Id列将具有由Mig#自动生成的所需触发器和序列。Oracle12c已经解决了。以上就是C#学习教程:如何通过Entity框架为Oracle数据库自动生成标识?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——[DatabaseGenerated(DatabaseGeneratedOption.Identity)]publicintSomeNumber{get;放;}本文收集自网络,不代表任何内容,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: