Расширьте класс сущностей LINQ с помощью методов конструктора и сделайте этот класс сущностей наследуемым от его класса DataContext - PullRequest
0 голосов
/ 21 октября 2008

Возможно ли расширить классы сущностей 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 есть два метода-конструктора. Я хотел бы перенести их в User класс сущностей и расширить класс сущностей User в своем классе контекста данных, чтобы контекст данных был доступен для класса сущностей на "новичок".

Надеюсь, это имеет смысл.

Ответы [ 3 ]

1 голос
/ 21 октября 2008

У Рика Стрэла есть несколько действительно хороших статей, посвященных тому, что я думаю, вы ищете Проверьте его список Linq статей здесь

1 голос
/ 22 октября 2008

Наследование объекта из контекста данных - плохая идея. Они представляют собой два отдельных объекта и предназначены для работы таким образом. Это приведет к возникновению всех видов проблем, а не к проблемам с попыткой одновременной отправки нескольких связанных изменений - прохождение нескольких контекстов данных приведет к сбою, так как каждый пытается работать независимо.

0 голосов
/ 21 октября 2008

Кажется, не имеет смысла делать сущность типом 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(); }
   }
}

Если вы просто хотите, чтобы имена свойств отличались от имен столбцов базы данных, сделайте это в файле сопоставления.

...