コンストラクターメソッドを使用してLINQエンティティクラスを拡張し、そのエンティティクラスがそのDataContextクラスを継承するようにする

StackOverflow https://stackoverflow.com/questions/222897

  •  03-07-2019
  •  | 
  •  

質問

LINQ-to-SQLエンティティクラスをコンストラクターメソッドで同じように拡張できます。そのエンティティクラスをデータコンテキストクラスから継承させますか?-本質的にエンティティクラスをビジネスオブジェクトに変換します。

これは私が現在使用しているパターンです:

namespace Xxx
{
    public class User : Xxx.DataContext
    {
        public enum SiteAccessRights
        {
            NotRegistered = 0,
            Registered = 1,
            Administrator = 3
        }

        private Xxx.Entities.User _user;

        public Int32 ID
        {
            get
            {
                return this._user.UsersID;
            }
        }

        public Xxx.User.SiteAccessRights AccessRights
        {
            get
            {
                return (Xxx.User.SiteAccessRights)this._user.UsersAccessRights;
            }

            set
            {
                this._user.UsersAccessRights = (Int32)value;
            }
        }

        public String Alias
        {
            get
            {
                return this._user.UsersAlias;
            }

            set
            {
                this._user.UsersAlias = value;
            }
        }


        public User(Int32 userID)
        {
            var user = (from u in base.Users
                        where u.UsersID == userID
                        select u).FirstOrDefault();

            if (user != null)
            {
                this._user = user;
            }
            else
            {
                this._user = new Xxx.Entities.User();

                base.Users.InsertOnSubmit(this._user);
            }
        }


        public User(Xxx.User.SiteAccessRights accessRights, String alias)
        {
            var user = (from u in base.Users
                        where u.UsersAccessRights == (Int32)accessRights && u.UsersAlias == alias
                        select u).FirstOrDefault();

            if (user != null)
            {
                this._user = user;
            }
            else
            {
                this._user = new Xxx.Entities.User
                {
                    UsersAccessRights = (Int32)accessRights,
                    UsersAlias = alias
                };

                base.Users.InsertOnSubmit(this._user);
            }
        }


        public void DeleteOnSubmit()
        {
            base.Users.DeleteOnSubmit(this._user);
        }
    }
}

更新:

User クラスに2つのコンストラクターメソッドがあることに注意してください。これらを User エンティティクラスに転送し、 データコンテキストクラスの User エンティティクラスを拡張したいので、データコンテキストは、「新規」でエンティティクラスで使用できます。

これが理にかなっていることを願っています。

役に立ちましたか?

解決

エンティティをDataContextのタイプにすることは意味がないようです。ビジネスオブジェクトと見なされるためにDataContextである必要はなく、元のエンティティを含む型を作成する必要もありません。エンティティクラスを拡張し、構成を使用してDataContextへの参照を含めることをお勧めします。

namespace Xxx.Entities
{
  public partial class User : IDisposable
   { DataContext ctx;

     public static GetUserByID(int userID)
      {  var ctx  = new DataContext();
         var user = ctx.Users.FirstOrDefault(u=>u.UsersID == userID);

         if (user == null)
          {
             user = new User();
             ctx.Users.InsertOnSubmit(user);
          }

         user.ctx = ctx;
         return user;          
      }      

     public void Dispose() { if (ctx != null) ctx.Dispose(); }
   }
}

プロパティ名をデータベースの列名と異なるものにする場合は、マッピングファイルでそれを行います。

他のヒント

Rick Strahlには、私があなたが探していると思うことを扱った本当に良い記事がたくさんあります。彼の Linqの記事はこちら

をご覧ください。

データコンテキストからエンティティを継承するのは悪い考えです。これらは2つの別個のオブジェクトであり、そのように動作するように設計されています。これを行うと、関連する一連の変更を同時に送信しようとすると、すべての種類の問題が発生します-複数のデータコンテキストを通過すると、それぞれが独立して機能しようとするため、これが失敗します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top