1

我使用 EF+MySql,数据库包含两个 foriegnkey,当我运行我的项目时,它说:已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭,然后我将 MultipleActiveResultSets=true 添加到 web.xml 中的连接字符串。 config,我再试一次,它告诉我:初始化字符串的格式不符合规范,我该如何解决这个问题?代码不同的foriegnkey和错误的初始化代码列表如下:

#region EDM 关系源元数据

[assembly: EdmRelationshipAttribute("blogModel", "cid", "cls", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(blog.Models.cls), "news", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(blog.Models.news), true)]
[assembly: EdmRelationshipAttribute("blogModel", "uid", "users", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(blog.Models.users), "news", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(blog.Models.news), true)]

#endregion

#region 导航属性

    /// <summary>
    /// 没有元数据文档可用。
    /// </summary>
    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("blogModel", "cid", "cls")]
    public cls cls
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<cls>("blogModel.cid", "cls").Value;
        }
        set
        {
            ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<cls>("blogModel.cid", "cls").Value = value;
        }
    }
    /// <summary>
    /// 没有元数据文档可用。
    /// </summary>
    [BrowsableAttribute(false)]
    [DataMemberAttribute()]
    public EntityReference<cls> clsReference
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<cls>("blogModel.cid", "cls");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<cls>("blogModel.cid", "cls", value);
            }
        }
    }

    /// <summary>
    /// 没有元数据文档可用。
    /// </summary>
    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("blogModel", "uid", "users")]
    public users users
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<users>("blogModel.uid", "users").Value;
        }
        set
        {
            ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<users>("blogModel.uid", "users").Value = value;
        }
    }
    /// <summary>
    /// 没有元数据文档可用。
    /// </summary>
    [BrowsableAttribute(false)]
    [DataMemberAttribute()]
    public EntityReference<users> usersReference
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<users>("blogModel.uid", "users");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<users>("blogModel.uid", "users", value);
            }
        }
    }

    #endregion


public partial class blogEntities : ObjectContext
{
    #region 构造函数

    /// <summary>
    /// 请使用应用程序配置文件的“blogEntities”部分中的连接字符串初始化新 blogEntities 对象。
    /// </summary>
    public blogEntities() : base("name=blogEntities", "blogEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// 初始化新的 blogEntities 对象。
    /// </summary>
    public blogEntities(string connectionString) : base(connectionString, "blogEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// 初始化新的 blogEntities 对象。
    /// </summary>
    public blogEntities(EntityConnection connection) : base(connection, "blogEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    #endregion
4

2 回答 2

3

为每个DataReaders 使用不同的打开和关闭 SQL 连接名称。这将解决问题。

由于您对多个DataReaderVB.NET 中的 SQL 服务器不支持使用相同的打开和关闭数据库连接。

于 2012-11-30T07:33:33.983 回答
3

据我所知MultipleActiveResultSets,在 MySql 上不可用,因此您无法将其添加到连接字符串(它适用于 MS SQL)。

这个问题的原因很可能是延迟加载。您正在迭代某些查询的结果,同时您访问循环内未加载的导航属性。这需要执行额外的查询,并且该查询需要一个新的数据读取器(第一个仍然没有关闭,因为您只是在迭代它的结果集)。

解决方案:

  • ToList要么通过使用或也许也将要迭代的查询的整个结果集具体化AsEnumerable
  • 或者通过使用急切加载您想在循环内使用的导航属性Include
于 2012-07-02T08:21:23.137 回答