【问题标题】:How to use EntityFramework connection string for Elmah?如何为 Elmah 使用 EntityFramework 连接字符串?
【发布时间】:2010-11-08 04:29:14
【问题描述】:

在 ELMAH 中用于将错误记录到数据库中,您可以编写:

<errorLog type="Elmah.SqlErrorLog, Elmah"
            connectionStringName="EducoparkEntities"/>

但是,如果我使用 EntityFramework,这不起作用,因为 EF 的连接字符串也包含元数据:

<add name="EducoparkEntities" connectionString="metadata=res://*/EducoparkData.csdl|res://*/EducoparkData.ssdl|res://*/EducoparkData.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=(Local);Initial Catalog=...;User Id=...;Password=...;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"/>

那么,如何在 Elmah 中使用 EntityFramework 连接字符串?

【问题讨论】:

  • 哇,为什么 EF 不能使用我们从那以后一直使用的相同连接字符串格式? 2002 年? #失败
  • 是的,我的意思是这已经工作了多年,为什么要改变它呢??

标签: asp.net .net entity-framework elmah


【解决方案1】:

你不能——至少不能直接。您需要做的是提取 EF 连接字符串中真正引用数据库的部分(provider connection string),并将其放入 web.config 的 &lt;connectionStrings&gt; 部分的自己的条目中:

<connectionStrings>
  <add name="EducoparkELMAH"
      connectionString="Data Source=(Local);Initial Catalog=...;User Id=...;Password=...;MultipleActiveResultSets=True" 
      provider="System.SqlClient" />
</connectionStrings>

或者您可以通过编程方式执行此操作 - 实体上下文将具有一个名为“Connection”的属性,该属性又具有一个属性“ConnectionString”,这就是您要查找的属性:

string elmahConnectionString = EducoparkEntities.Connection.ConnectionString;

马克

【讨论】:

    【解决方案2】:

    1

    您可以通过实体框架中提供的 ConnectionStringBuilder 提取数据库连接字符串。

    private string ExtractConnectionStringFromEntityConnectionString(string entityConnectionString)
    {
        // create a entity connection string from the input
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(entityConnectionString);
    
        // read the db connectionstring
        return entityBuilder.ProviderConnectionString;
    }
    

    2

    要将数据库连接字符串插入 Elmah,您必须在 Application_Start(在 Global.asax 中)上设置它

    【讨论】:

    • 警告:如果您需要密码来访问数据库,它不会包含在 ProviderConnectionString 中。
    • 您已经展示了如何提取连接字符串以及在哪里执行替换,但是您还没有展示如何 来替换 Elmah 的默认连接字符串。我该怎么做?
    【解决方案3】:
        public class YourErrorLog : SqlErrorLog
        {
            public override string ConnectionString
            {
                get
                {
                    //return any Connection string EF or any
                }
            }
        }
    

    并修改配置

        <elmah>
            <errorLog type="YourAssembly.YourErrorLog, YourAssembly" connectionStringName="elmah-sqlserver" />
        </elmah>
    

    Elmah 会询问 sql 连接字符串,但它会在需要时获取您的连接字符串。

    【讨论】:

    • 我设法运行了它,但必须基于 SqlErrorLog 的构造函数创建一个适当的构造函数(请参阅yoda.arachsys.com/csharp/constructors.html -- 构造函数不被继承)
    • @GôTô all we know ctor rules ;) 注意请回答日期。当我给这个代码SqlErrorLog没有带有参数的ctor时,我们谈论新的elmah SqlErroLog有ctor参数?
    【解决方案4】:

    您可以为此使用Elmah.Contrib.EntityFramework nuget 包。

    (免责声明:我写的)

    【讨论】:

    • 在数据库优先模式下有没有办法指定不同的模式?
    • @Santhos:是的,ctorsElmahContext 之一接受架构名称。
    • 我知道,我检查了代码,但是可以直接从 web.config 配置吗?
    • @Santhos:不,我不这么认为,SQL Server 连接字符串不允许指定方案名称,请参阅stackoverflow.com/questions/3282665/…
    • 我喜欢你的解决方案,我现在必须考虑我是否真的想要我的默认模式和同一用户下的表和过程 - 根据那个问题,似乎必须创建一个新用户,为其分配一个不同的架构,然后让 elmah 在该用户下登录。
    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 2011-08-13
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多