如何通过Entity框架自动为Oracle数据库生成标识?
我正在使用Oracle提供程序entity framework(beta),我遇到了一个问题。
我们的表有Id列,在StoreGeneratedPattern中设置为Identity。 我认为EF会自动执行“基础工作”,例如创建序列,并为我添加到表中的每条记录获取新标识。 但是当我运行代码来添加新记录时,例如:
var comment = new Comment { ComplaintId = _currentComplaintId, Content = CommentContent.Text, CreatedBy = CurrentUser.UserID, CreatedDate = DateTime.Now }; context.Comments.AddObject(comment); context.SaveChanges();
一个exception仍然会抛出,这是
{“ORA-00001:违反了唯一约束(ADMINMGR.CONSTRAINT_COMMENT)”}
(CONSTRAINT_COMMENT是约束要求注释标识必须是唯一的。
我该如何解决这个问题?
非常感谢你!
StoreGeneratedPattern =“Identity”只是告诉EF该值将在插入时生成DB端,并且它不应在insert语句中提供值。
您仍需要在Oracle中创建序列:
create sequence ComplaintIdSequence minvalue 1 maxvalue 9999999 start with 1 increment by 1;
以及使表插入使用它的触发器:
create or replace trigger CommplaintIdTrigger before insert on comment for each row begin if :new.ComplaintId is null then select ComplaintIdSequence.nextval into :new.ComplaintId from dual; endif; end;
另一种选择是:
按照Alextansc描述的方式创建序列。 创建一个使用MySequence.nextval作为主键的存储过程。
将此模型的“插入”映射到您的存储过程,它可以工作!
我使用数据库第一种方法测试了这个。
使用数据库优先映射到存储过程非常简单。 转到edmx文件,右键单击要映射到存储过程的模型。 单击“存储过程映射”。 页面底部的对话框提供了三个下拉菜单,用于将插入,更新和删除映射到存储过程。
我正在使用Oracle ODP.NET,托管驱动程序和entity framework6.我使用代码优先方法创建了我的表,但由于空主键而无法添加任何记录。
解决方案是授予我的用户:
‘创造顺序’和
‘创造触发’
权限并重新创建架构。
我在包管理控制台中使用-verbose标志后意识到这一点
而不是记住所有这些SQL,你可以轻松地使用Mig#这样:
var schema = new DbSchema(ConnectionString, DbPlatform.Oracle12c); schema.Alter(db => db.CreateTable("TableName") .WithPrimaryKeyColumn("Id", DbType.Int32).AsIdentity() ...);
在此示例中, Id
列将具有Mig#自动生成的所需触发器和序列。
Oracle 12c已经解决了它
上述就是C#学习教程:如何通过Entity框架自动为Oracle数据库生成标识?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int SomeNumber { get; set; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1043466.html