使用构造函数方法扩展LINQ实体类,并使该实体类从其DataContext类继承

时间:2008-10-21 18:18:41

标签: linq-to-sql .net-3.5 c#-3.0

是否可以使用构造函数方法扩展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 个答案:

答案 0 :(得分:1)

Rick Strahl有很多非常好的文章可以解决我认为你正在寻找的问题。查看他的Linq Articles Here

列表

答案 1 :(得分:1)

从数据上下文继承实体是个坏主意。它们是两个独立的对象,旨在以这种方式运行。这样做会导致各种问题,尤其是在尝试同时提交大量相关更改时会遇到的问题 - 通过多个数据上下文会导致每个尝试独立工作时失败。

答案 2 :(得分:0)

将实体作为一种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(); }
   }
}

如果您只想让属性名称与数据库列名称不同,请在映射文件中执行此操作。