繁体   English   中英

在使用Entity Framework首先在表上插入行之前,如何从PL / SQL执行触发器?

[英]How to execute a trigger from PL/SQL before inserting a row on a table with Entity Framework database-first?

我已经在PL / SQL中创建了一个触发器,该触发器是在表中插入行之前触发的,这是通过Oracle序列增加值,然后作为主键插入到表中的。

这是我从PL / SQL触发的代码:

create or replace trigger FUT_SYS_USER_BE_I
before insert on FUT_SYS_USER referencing old as O new as N
for each row
  declare
  --local variables here
  begin
    if :N.SYS_USER_ID is null then
      :N.SYS_USER_ID := SYS_USER_SEQ.NEXTVAL;
    end if;
  end FUT_SYS_USER_BE_I;

但是此触发器永远不会执行,因为当我插入一行时,主键SYS_USER_ID永远不会增加并保存零值。

这是我的C#代码:

using(DemoDBEntities db = new DemoDBEntities())
{
        FUT_SYS_USER SU = new FUT_SYS_USER();
        SU.LOGIN_NAME = user.LoginName;
        SU.PASSWORD_ENCRYPTED_TEXT = user.Password;
        SU.ROW_CREATED_SYSUSER_ID = user.SYSUserID > 0 ? user.SYSUserID : 1;
        SU.ROW_MODIFIED_SYSUSER_ID = user.SYSUserID > 0 ? user.SYSUserID : 1; 
        SU.ROW_CREATED_DATETIME = DateTime.Now;
        SU.ROW_MODIFIED_DATETIME = DateTime.Now;

        db.FUT_SYS_USER.Add(SU);
        db.SaveChanges();
}

关于如何解决此问题的任何想法?

您需要告诉EF这是数据库正在填充的列。 如果您打开了.edmx设计器,请选择相应的列,然后查看其属性。 您要查找的是属性StoreGeneratedPattern ,可以将其设置为“无”(默认值),“计算的”或“身份”。

我不确定哪一个将在Oracle中工作,但是在SQL Server中,对于identity列(在插入行时SQL Server自动将其自动递增),我总是设置StoreGeneratedPattern=Identity在这种情况下为EF不会向该列的数据库发送值,然后您的触发器应完成其工作。

在此处输入图片说明

您需要将该列的.edmx模型属性中的键列(SYS_USER_ID)的StoreGeneratedPattern设置为Identity。 如果将来从.edmx模型中删除该表并重新创建,则需要再次进行设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM