【问题标题】:How to automatically replace null strings on insert in Entity Framework 6 using interception如何使用拦截在实体框架 6 中插入时自动替换空字符串
【发布时间】:2017-12-12 10:42:02
【问题描述】:

如果字符串为空或在插入之前为所有表为空,我想插入空格或一些默认值(因为 Oracle 将空白值视为空,但它与 SQL Server 一起工作正常)。我正在使用实体框架 6.0。

在谷歌上搜索了很多之后,我找到了一个类似的答案here。但这对我不起作用。显示错误

对象不包含值的定义

如何使用实体框架拦截器来实现这一点?

【问题讨论】:

  • 在属性的设置器中检查该值是否为空,但是你想要什么,或者你可以给它一个默认值
  • 使用链接中的代码,但将foreach (var p in command.Parameters)替换为foreach (var p in command.Parameters.Cast<DbParameter>())
  • @IvanStoev 您的代码显示错误 - System.Data.Common.DbParameterCollection' 不包含“Cast”的定义,并且没有扩展方法“Cast”接受“System.Data”类型的第一个参数。可以找到 Common.DbParameterCollection'(您是否缺少 using 指令或程序集引用?)
  • @deepakneo 您知道如何解决此类错误,不是吗? Control+Dot、灯泡等添加 using System.Linq; 或者只是我试图避免的旧 stype cast foreach foreach (DbParameter p in command.Parameters)
  • 谢谢伙计,很高兴它有帮助。但这是一个问题,因此应该在链接中高度赞成的答案中得到解决。我认为如果您发布自我回答您是如何解决相关问题的会更合适。

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


【解决方案1】:
 public class StringInterceptor : IDbCommandInterceptor
    {
        public void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            foreach (var p in command.Parameters.Cast<DbParameter>())
            {
                if (p.Value is string)
                {
                    if (((string)p.Value) == string.Empty)
                    {
                        p.Value = " ";
                    }
                }

            }

        }

最后我解决了这个问题。感谢@Ivan Stoev

【讨论】:

    【解决方案2】:

    你必须重写 SaveChange()。这个链接会给你一个想法—— Overriding SaveChanges and setting ModifiedDate, but how do I set ModifiedBy?

    【讨论】:

    • 如何使用此解决方案将我的所有空字符串替换为空格?我不知道字段名称它可以是任何东西
    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多