13

我正在为实体框架(测试版)使用 Oracle 提供程序,但我遇到了一个问题。

我们的表有 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();

仍然抛出异常,即

{“ORA-00001:违反了唯一约束 (ADMINMGR.CONSTRAINT_COMMENT)”}

(CONSTRAINT_COMMENT 是约束要求评论标识必须是唯一的。

我该如何解决这个问题?

非常感谢你!

4

5 回答 5

17

StoreGeneratedPattern="Identity" 只是告诉 EF 该值将在插入时在数据库端生成,并且不应在插入语句中提供值。

您仍然需要在 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;
于 2011-03-08T03:52:45.983 回答
1

Oracle 12c 已解决

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int SomeNumber { get; set; }
于 2017-02-04T10:45:50.013 回答
0

另一种选择是:

按照 Alextansc 描述的方式创建一个序列。创建一个使用 MySequence.nextval 作为主键的存储过程。

将此模型的“插入”映射到您的存储过程,它可以工作!

我已经使用数据库优先方法对此进行了测试。

使用数据库优先映射到存储过程非常简单。转到您的 edmx 文件并右键单击要映射到存储过程的模型。单击“存储过程映射”。页面底部的对话框为您提供了三个下拉菜单,用于将插入、更新和删除映射到存储过程。

于 2014-02-20T17:55:12.813 回答
0

我正在使用 Oracle ODP.NET、托管驱动程序和实体框架 6。我使用代码优先方法创建了我的表,但由于主键为空而无法添加任何记录。

解决方案是同时授予我的用户:
“CREATE SEQUENCE”
“CREATE TRIGGER”
权限并重新创建架构。

在包管理控制台中使用 -verbose 标志后,我意识到了这一点

于 2015-10-22T02:33:29.460 回答
0

无需记住所有这些 SQL,您可以像这样使用Mig#轻松完成:

        var schema = new DbSchema(ConnectionString, DbPlatform.Oracle12c);
        schema.Alter(db => db.CreateTable("TableName")
            .WithPrimaryKeyColumn("Id", DbType.Int32).AsIdentity()
            ...);

在此示例中,该Id列将具有由 Mig# 自动生成的所需触发器和序列。

于 2015-12-23T15:13:54.177 回答