1

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 で問題ありません。

4

1 に答える 1