0

DB へのクエリの結果を POCO に入力しようとしています。結果セットには複数の行があるため、各結果を繰り返し処理して POCO にデータを入力すると、次のエラーが表示されます。

私はどこを台無しにしていますか?

こんなふうになります:

【コントローラー.cs】

        /// <summary>
        /// Populates the inner Ads list
        /// </summary>
        public void FetchAds()
        {
            _ads = new List<Ad>();
            using (var context = (ApartmentDataEntities) DbContextFactory.GetInstance().GetDbContext<ApartmentDataEntities>())
            {
                foreach (var config in context.Configurations)
                {
                    _ads.Add(new AdModel(_basePath, config));
                }

            }

            AdsReady.SafeTrigger(this, new AdArray { Ads = _ads.ToArray() });
        }

[AdModel.cs] (POCO から継承)

    public AdModel(String baseFolder, Configuration apartment)
    {
        _baseFolder = baseFolder;
        GetAd(apartment);

    }


    /// <summary>
    /// Populates the Ad from the Database
    /// </summary>
    private void GetAd(Configuration apartment)
    {

        PropertyId = apartment.Property.id;
        PropertyName = apartment.Property.name;
        PropertyPhone = apartment.Property.phone;
        PropertyAddress = apartment.Property.address;
        AreaName = apartment.Property.MapArea.areaName;
        RegionName = apartment.Property.MapArea.Region.name;
        PropertyZipCode = apartment.Property.zipCode;
        ComissionRate = apartment.Property.comissionRate;
        Images = apartment.Property.Images.Select(img => img.id).ToArray();
        YearBuilt = apartment.Property.yearBuilt;
        Features = apartment.Property.features;
        Ammenities = apartment.Property.ammenities;
        CommunitySpecial = apartment.Property.communitySpecial;
        PetPolicy = apartment.Property.petPolicy;
        Size = apartment.size;
        Bathrooms = apartment.bathrooms;
        Bedrooms = apartment.bedrooms;
        Price = apartment.price;
        PropertyImages = apartment.Property.Images.Select(img => img.imageContents).ToArray();
        FloorplanImage = null;
        Floorplan = null;

        var configFloorplan = apartment.Images.SingleOrDefault();
        if (configFloorplan == null) return;

        FloorplanImage = configFloorplan.imageContents;
        Floorplan = configFloorplan.id;
    }
4

2 に答える 2

1

通常、クエリ自体で別のモデルへの投影を行うことをお勧めします。お気に入り

_ads = (from apartment in context.Configurations
        let configFloorplan = apartment.Images.SingleOrDefault()
        select new AdModel
        {
            PropertyId = apartment.Property.id,
            PropertyName = apartment.Property.name,
            PropertyPhone = apartment.Property.phone,
            ...
            PropertyImages = apartment.Property.Images
                                      .Select(img => img.imageContents),
            FloorplanImage = configFloorplan.imageContents,
            Floorplan = configFloorplan.id
        }).ToList();

これにより、すべてが 1 つのクエリとして実行されます。あなたのアプローチの問題は、EFがcontext.Configurations他のクエリを読み取っている間に、モデルの追加のプロパティを設定するために実行されることです。

これは、接続文字列で複数のアクティブな結果セット (MARS) を有効にすることで (おそらく) 解決できます。ただし、多数のクエリ (マテリアライズド モデルごとに 2 つのクエリ) を実行する可能性があるという事実は修正されません。

于 2013-11-10T21:00:51.240 に答える
0

EntityFramework を使用していますか? GetAdd の .Select が遅延読み込みであるため、外部クエリがまだ開いている間に DB をクエリしようとしている可能性があります。context.Configurations の後に toArray() を追加してみてください。そのエラーを回避するために、これらをあちこちに振りかける必要があったようです.

于 2013-11-10T06:35:32.570 に答える