如何在使用Entity Framework数据库优先的表上插入行之前从PL / SQL执行触发器?

时间:2017-04-24 14:02:59

标签: c# asp.net-mvc oracle entity-framework plsql

我在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();
}

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

2 个答案:

答案 0 :(得分:0)

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

我不确定哪一个可以在Oracle中运行,但在SQL Server中,对于identity列(在插入行时由SQL Server自动增加),我总是设置StoreGeneratedPattern=Identity - 在这种情况下,EF不会向此列的数据库发送值,然后您的触发器应该正常工作。

enter image description here

答案 1 :(得分:0)

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