EF 5 と dot.NET 4.5 で Enum サポートを使用しようとしています。
私が持っている状況は次のとおりです。
ポコ:
public partial class tbl_pp_Message
{
public tbl_pp_Message()
{
this.tbl_pp_MessageDistribution = new List<tbl_pp_MessageDistribution>();
}
public int MessageId { get; set; }
public string Subject { get; set; }
public string From { get; set; }
public string Body { get; set; }
public int PriorityId { get; set; }
public System.DateTime CreateDate { get; set; }
public int CreateById { get; set; }
[ForeignKey("PriorityId")]
public virtual tbl_pp_MessagePriority tbl_pp_MessagePriority { get; set; }
public virtual ICollection<tbl_pp_MessageDistribution> tbl_pp_MessageDistribution { get; set; }
}
public partial class tbl_pp_MessagePriority
{
public tbl_pp_MessagePriority()
{
this.tbl_pp_Message = new List<tbl_pp_Message>();
}
public int MessagePriorityId { get; set; }
public string Description { get; set; }
public Nullable<int> DisplayOrder { get; set; }
public bool ShowAlert { get; set; }
public virtual ICollection<tbl_pp_Message> tbl_pp_Message { get; set; }
}
ENUM を使用しない上記のコードでは、世界は満足しています。
Enum を追加しようとすると、POCO は次のようになります。
[Flags]
public enum MessagePriorityEnum : int
{
NONE = 0,
Urgent = 1,
Normal = 2,
Low = 3
}
public partial class tbl_pp_Message
{
public tbl_pp_Message()
{
this.tbl_pp_MessageDistribution = new List<tbl_pp_MessageDistribution>();
}
public int MessageId { get; set; }
public string Subject { get; set; }
public string From { get; set; }
public string Body { get; set; }
public MessagePriorityEnum PriorityId { get; set; }
public System.DateTime CreateDate { get; set; }
public int CreateById { get; set; }
[ForeignKey("PriorityId")]
public virtual tbl_pp_MessagePriority tbl_pp_MessagePriority { get; set; }
public virtual ICollection<tbl_pp_MessageDistribution> tbl_pp_MessageDistribution { get; set; }
}
これは、ForeignKey 属性が気に入らないため、保存中には機能しません。このエラーは、保存中にスローされます。
指定されたスキーマは無効です。エラー:
(129,6) : エラー 0112: 参照制約の従属ロールのすべてのプロパティの型は、プリンシパル ロールの対応するプロパティの型と同じでなければなりません。エンティティ 'tbl_pp_Message' のプロパティ 'PriorityId' のタイプは、参照制約 'tbl_pp_MessagePriority_tbl_pp_Message' のエンティティ 'tbl_pp_MessagePriority' のプロパティ 'MessagePriorityId' のタイプと一致しません。
tbl_pp_MessagePriority のナビゲーションが tbl_pp_Message POCO から削除された場合。そして、 tbl_pp_MessagePriority POCO から削除されたナビゲーションが tbl_pp_Message に戻ると、機能します。ナビゲーションを削除しないと、次のような SQL ステートメントが生成されます。
insert [dbo].[tbl_pp_Message]
([Subject],
[From],
[Body],
[PriorityId],
[CreateDate],
[CreateById],
[tbl_pp_MessagePriority_MessagePriorityId])
values ('Test ENUM EF Code First 5.0' /* @0 */,
'Daniel.Bivens' /* @1 */,
'Test 01 Enum Body - The Magic Unicorn Edition' /* @2 */,
2 /* @3 */,
'2013-05-23T10:52:09' /* @4 */,
5 /* @5 */,
null)
select [MessageId]
from [dbo].[tbl_pp_Message]
where @@ROWCOUNT > 0
and [MessageId] = scope_identity()
tbl_pp_MessagePriority_MessagePriorityId が挿入に追加されていなくても問題ありません。
ENUMサポートを使用している間、最初にEFコードでナビゲーションを維持するにはどうすればよいですか? DataAnnotation または Mapping API はありますか?
提案があれば投稿してください。このプロジェクトは EDMX/T4 テンプレートを使用していません。
ワーキング POCO:
public partial class tbl_pp_Message
{
//public tbl_pp_Message()
//{
// this.tbl_pp_MessageDistribution = new List<tbl_pp_MessageDistribution>();
//}
public int MessageId { get; set; }
public string Subject { get; set; }
public string From { get; set; }
public string Body { get; set; }
public MessagePriorityEnum PriorityId { get; set; }
public System.DateTime CreateDate { get; set; }
public int CreateById { get; set; }
//[ForeignKey("PriorityId")]
//public virtual tbl_pp_MessagePriority tbl_pp_MessagePriority { get; set; }
//public virtual ICollection<tbl_pp_MessageDistribution> tbl_pp_MessageDistribution { get; set; }
}
public partial class tbl_pp_MessagePriority
{
//public tbl_pp_MessagePriority()
//{
// this.tbl_pp_Message = new List<tbl_pp_Message>();
//}
public int MessagePriorityId { get; set; }
public string Description { get; set; }
public Nullable<int> DisplayOrder { get; set; }
public bool ShowAlert { get; set; }
//public virtual ICollection<tbl_pp_Message> tbl_pp_Message { get; set; }
}
ナビゲーションが必要ない場合は、動作中の POCO で問題ありません。