1

EF5 のルックアップ テーブルで列挙型を実装しようとしています。私は最初にモデルを使用しています。「Appraisal_Type_ID」列を持つ「Appraisal」というメイン エンティティがあります。これはデータベース内の INT です。「Appraisal_Type」というエンティティもあり、これには「Appraisal_Type_ID」と説明が含まれています。2 つのエンティティ間に関連付けがあり、メインの評価テーブルとルックアップ テーブルの両方で Int を列挙型に切り替えました。生成されたコードで 2 つのエンティティがどのように見えるかを次に示します。

public partial class Appraisal
{
    public Appraisal()
    {
        this.Goals = new HashSet<Goal>();
        this.NewGoals = new HashSet<NewGoal>();
        this.CompetencyResults = new HashSet<CompetencyResult>();
        this.Attachments = new HashSet<Attachment>();
        this.Notes = new HashSet<Note>();
        this.NewCompetency_Results = new HashSet<NewCompetency_Results>();
        this.AppraisalActivityLogEntries = new HashSet<AppraisalActivityLogEntry>();
    }

    public int Appraisal_ID { get; set; }
    public string Penn_ID { get; set; }
    public string Review_Year { get; set; }
    public string Supervisor_Penn_ID { get; set; }
    public AppraisalType Appraisal_Type_ID { get; set; }
    public int Appraisal_Status_ID { get; set; }
    public Nullable<System.DateTime> Last_Update_Date { get; set; }
    public string Last_Update_User { get; set; }
    public string Future_Development { get; set; }
    public string Rating_Comments { get; set; }
    public Nullable<System.DateTime> Supervisor_Sign_Date { get; set; }
    public Nullable<System.DateTime> Employee_Sign_Date { get; set; }
    public string Employee_Comments { get; set; }
    public Nullable<System.DateTime> Next_ReviewDate { get; set; }
    public string Home_Dept_Org { get; set; }
    public string Home_School_Ctr { get; set; }
    public Nullable<int> ContentType_ID { get; set; }
    public string Name { get; set; }
    public string Rating_Code { get; set; }
    public Nullable<bool> Final_Step_Reached { get; set; }
    public string Supervisor_Name { get; set; }
    public string Supervisor_Job_Class { get; set; }
    public string Supervisor_Job_Title { get; set; }
    public string Current_Editor { get; set; }
    public string Current_Editor_Name { get; set; }

    public virtual ICollection<Goal> Goals { get; set; }
    public virtual ICollection<NewGoal> NewGoals { get; set; }
    public virtual ICollection<CompetencyResult> CompetencyResults { get; set; }
    public virtual ICollection<Attachment> Attachments { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
    public virtual AppraisalUser AppraisalUser { get; set; }
    public virtual ICollection<NewCompetency_Results> NewCompetency_Results { get; set; }
    public virtual ContentType ContentType { get; set; }
    public virtual ICollection<AppraisalActivityLogEntry> AppraisalActivityLogEntries { get; set; }
    public virtual Appraisal_Status Status { get; set; }
    public virtual Rating Rating { get; set; }
    public virtual Appraisal_Type AppraisalType { get; set; }
}

public partial class Appraisal_Type
{
    public AppraisalType Appraisal_Type_ID { get; set; }
    public string Appraisal_Type_Desc { get; set; }
}

public enum AppraisalType : int
{
    Appraisal = 2,
    SelfAppraisal = 1
}

データベースから評価を簡単に取得でき、列挙型で正常に動作し、データベースから Appraisal_Type データを簡単に取得でき、列挙型で正常に動作します。

ただし、目標は、.Include を使用して、評価で Appraisal_Type を取得することです。これはエラーをスローします。

public Appraisal GetAppraisal(int appraisalID)
    {
        using (AppraisalEntities context = new AppraisalEntities(AppraisalEntitiesConnectionString))
        {
            context.Configuration.LazyLoadingEnabled = false;
            context.Configuration.ProxyCreationEnabled = true;

            Appraisal data = context.Appraisals
            .Include("Goals")
            .Include("NewGoals")
            .Include("CompetencyResults")
            .Include("CompetencyResults.Competency")
            .Include("NewCompetency_Results")
            .Include("NewCompetency_Results.NewCompetency")
            .Include("Attachments")
            .Include("Rating")
            .Include("Notes")
            .Include("AppraisalUser")
            .Include("Status")
            .Include("AppraisalType")
            .Include("ContentType")
            .First(c => c.Appraisal_ID == appraisalID);

            return data;
        }
    }

このコードを実行すると、次のエラーが発生します。

*キー フィールド 'Appraisal_Type_ID' のタイプは 'PennHR.HRManager.BusinessServices.Appraisals.AppraisalType' であると予想されますが、提供される値は実際にはタイプ 'System.Int32' です。*

コール スタックでこれを見ると、EF がキーを検証しようとしているようです。

    System.Data.EntityKey.ValidateTypeOfKeyValue(MetadataWorkspace workspace, EdmMember keyMember, Object keyValue, Boolean isArgumentException, String argumentName) +11452250
System.Data.EntityKey.ValidateEntityKey(MetadataWorkspace workspace, EntitySet entitySet, Boolean isArgumentException, String argumentName) +158
System.Data.Objects.ObjectStateManager.CheckKeyMatchesEntity(IEntityWrapper wrappedEntity, EntityKey entityKey, EntitySet entitySetForType, Boolean forAttach) +84
System.Data.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded) +269
System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly(Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) +262
lambda_method(Closure , Shaper ) +2651
System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) +10995785
System.Data.Common.Internal.Materialization.RowNestedResultEnumerator.MoveNext() +277
System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.TryReadToNextElement() +31
System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.MoveNext() +78
System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +247
System.Linq.Queryable.FirstOrDefault(IQueryable`1 source, Expression`1 predicate) +490
PennHR.HRManager.BusinessServices.Appraisals.AppraisalManager.GetAppraisal(String pennID, String reviewYear, AppraisalType type) in d:\Users\Blickley\Documents\Visual Studio 2012\Projects\HRManager\Trunk\HRManagerSolution\HRManager.BusinessServices\Appraisals\AppraisalManager.cs:359
PennHR.HRManager.Portal.Appraisals.AppraisalsDefault.btnViewSelfAppraisal_Click(Object sender, EventArgs e) in d:\Users\Blickley\Documents\Visual Studio 2012\Projects\HRManager\Trunk\HRManagerSolution\HRManager.Portal\Appraisals\AppraisalsDefault.aspx.cs:228
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +155
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3804

AppraisalType の .Include を削除すると、すべて問題ありません。このコードも正常に動作するため、問題を引き起こしているのはインクルードのようです。

    public Appraisal_Type GetAppraisalTypes()
    {
        AppraisalEntities context = new AppraisalEntities(AppraisalEntitiesConnectionString);
        Appraisal_Type data = context.Appraisal_Types
            .FirstOrDefault(c => c.Appraisal_Type_ID == AppraisalType.Appraisal);
        return data;
    }

エラーについてはあまり見つけられないようですが、これを回避する方法を考えられる人はいますか? 列挙型をルックアップ テーブルと一緒に使用できるようにしたいと考えています。列挙型を削除して Int に戻すと、すべて正常に動作します。

4

0 に答える 0