1

私は EF+MySql を使用します。データベースには 2 つの foriegnkey が含まれており、プロジェクトを実行すると、次のように表示されます。この接続に関連付けられている開いている DataReader が既にあり、最初に閉じる必要があります。次に、Web の接続文字列に MultipleActiveResultSets=true を追加します。 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

ごとに異なる Open および Close SQL 接続名を使用しますDataReader。これで問題は解決します。

DataReaderVB.NETのSQLサーバーではサポートされていない複数の同じオープンおよびクローズデータベース接続を使用しているため。

于 2012-11-30T07:33:33.983 に答える
3

私が知っMultipleActiveResultSetsているように、MySql では利用できないため、接続文字列に追加することはできません (MS SQL 用です)。

この問題の原因は、おそらく遅延読み込みです。いくつかのクエリの結果を繰り返し処理していると同時に、ループ内で読み込まれていないナビゲーション プロパティにアクセスしています。これには追加のクエリを実行する必要があり、そのクエリには新しいデータ リーダーが必要です (最初のデータ リーダーは、結果セットを反復しているだけなので、まだ閉じられていません)。

ソリューション:

  • 繰り返したいクエリの結果セット全体を使用してマテリアライズするToListか、おそらくまたAsEnumerable
  • または、使用してループ内で使用する熱心なロード ナビゲーション プロパティInclude
于 2012-07-02T08:21:23.137 に答える