1

私はカクテル、Devforce 2012 7.2.2 を使用しており、codeFirst モデルを持っています。

カクテルを使用してエンティティをプリロードしようとすると、エンティティの 1 つがエンティティ マネージャーのキャッシュに 7 つのエンティティのみをインポートするのに異常な時間を費やします。以下のログによると、インポートに 6 秒ほどかかります。

(DEBUG SL) 16:32:28.187 : MyApp.Common.PreLoadRepository`1:OnManagerCreated : PreLoadRepository<MyApp.Module.Domain.Entities.ModeTraitment>.Seed() imported 0 entites in 0.9998 ms. : ThreadId(1)
(DEBUG SL) 16:32:28.226 : MyApp.Common.PreLoadRepository`1:OnManagerCreated : PreLoadRepository<MyApp.Module.Domain.Entities.Motif>.Seed() imported 23 entites in 33.0001 ms. : ThreadId(1)
(DEBUG SL) 16:32:28.230 : MyApp.Common.PreLoadRepository`1:OnManagerCreated : PreLoadRepository<MyApp.Module.Domain.Entities.Attribut>.Seed() imported 0 entites in 1.0002 ms. : ThreadId(1)
Une exception de première chance de type 'System.NullReferenceException' s'est produite dans MyApp.Module.Domain.tn.SL
Une exception de première chance de type 'System.Reflection.TargetInvocationException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.NullReferenceException' s'est produite dans MyApp.Module.Domain.tn.SL
Une exception de première chance de type 'System.Reflection.TargetInvocationException' s'est produite dans mscorlib.dll

...

Une exception de première chance de type 'System.NullReferenceException' s'est produite dans MyApp.Module.Domain.tn.SL
Une exception de première chance de type 'System.Reflection.TargetInvocationException' s'est produite dans mscorlib.dll
(MyApp DEBUG SL) 16:32:34.958 : MyApp.Common.PreLoadRepository`1:OnManagerCreated : PreLoadRepository<MyApp.Module.Domain.Entities.TypeInterv>.Seed() imported 7 entites in 6726.06 ms. : ThreadId(1)
(MyApp DEBUG SL) 16:32:34.972 : MyApp.Common.PreLoadRepository`1:OnManagerCreated : PreLoadRepository<MyApp.Module.Domain.Entities.TypeIdentity>.Seed() imported 2 entites in 10.0012 ms. : ThreadId(1)

ログに表示されるすべての例外は、次のエンティティでの次の実行中に発生します: entityManager.ImportEntities(entities, MergeStrategy.OverwriteChanges): TypeInterv

このエンティティは TPH を使用します。TypeInterv は、RefenceBase という名前の基本クラスを継承します。プリローダーは、この基本クラス (ModeTraitment、Attribut など) を継承する多くのエンティティも問題なくロードします。

エンティティは次のようになります。

[DataContract(IsReference = true)]
public class TypeInterv : ReferenceBase
{
    [DataMember]
    [Required]
    public bool ForProf { get; set; }

    [DataMember]
    [Required]
    [Taux]
    public decimal TauxRet { get; set; }

    [DataMember]
    public RelatedEntityList<Tarif> Tarif { get { return null; } }
}

エンティティをクリーンアップして、何が問題なのかを調べようとしました。RelatedEntityList を削除しても、例外が発生し、実行時間が長くなります。2 つのプロパティを削除すると (1 つだけが修正されません)、例外が発生しなくなり、エンティティは 7 ミリ秒でインポートされます。

問題の原因は何ですか? postsharp によって挿入されたコードに関連する何かを推測していますか?

注: エンティティには基本的な構成クラスがあります。

public class TypeIntervConfiguration: EntityTypeConfiguration<TypeInterv>
{
    public TypeIntervConfiguration()
    {
        Map(e =>
                {
                    e.ToTable(Cst.Tables.TblReferenceBase);
                    e.Requires(Cst.Fields.Discriminant)
                        .HasValue(Cst.ReferenceBase.DiscriminantTypeInterv);
                });

        Property(p => p.ForProf)
            .HasColumnName(Cst.Fields.TypeIntervForProf);
        Property(p => p.TauxRet)
            .HasColumnName(Cst.Fields.TypeIntervTauxRet);
    }
}

属性 Taux は EF 規則です (属性なしでテストしようとしましたが、修正されません)

public class TauxConvention: Convention
{
    /// <summary>
    /// Constructeur
    /// </summary>
    public TauxConvention()
    {
        this.Properties()
            .Where(x => x.GetCustomAttributes(false).OfType<TauxAttribute>().Any())
            .Configure(c => c.HasPrecision(18, 8));
    }
}

何か案が ?

4

1 に答える 1

1

この問題への回答は、DevForce フォーラムで見つけることができます

于 2014-04-09T21:50:43.700 に答える