是否可以使用构造函数方法扩展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
实体类,以便数据上下文可用关于“新兴”的实体类。
希望这是有道理的。
答案 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(); }
}
}
如果您只想让属性名称与数据库列名称不同,请在映射文件中执行此操作。