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 に戻すと、すべて正常に動作します。