Estender um LINQ entidade de classe com métodos construtores e fazer que herdam entidade de classe da sua classe DataContext
-
03-07-2019 - |
Pergunta
É possível estender LINQ to SQL entidade classes com construtor-métodos e no mesmo movimento; fazer que herdam entidade de classe da sua classe ao contexto de dados -?. Em essência convertendo a entidade de classe em um objeto de negócios
Este é o padrão que eu estou usando atualmente:
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);
}
}
}
Update:
Observe que eu tenho duas construtor-métodos da minha classe User
. Eu gostaria de transferir aqueles ao User
entidade de classe e estender a User
entidade de classe em sua classe ao contexto de dados, para que os dados ao contexto está disponível para a entidade de classe em "nova -up".
Espero que isso faz sentido.
Solução
Não parece fazer sentido para fazer uma entidade um tipo de DataContext. Ele não precisa ser um DataContext, a fim de ser considerado um objeto de negócios, nem você precisa necessariamente criar um tipo que contém a entidade originais. Poderia ser melhor apenas para estender a classe entidade e incluir uma referência a um usando composição 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(); }
}
}
Se você quiser apenas os nomes de propriedade de ser diferente do que os nomes das colunas de banco de dados, fazer isso no arquivo de mapeamento.
Outras dicas
Rick Strahl tem um número de realmente bons artigos que endereço o que eu acho que você está procurando. Confira o seu lista de Linq artigos aqui
Herdando uma entidade a partir de um contexto de dados é uma má idéia. Eles são dois objetos distintos e são projetados para operar dessa maneira. Fazendo isso irá causar todos os tipos de questões menos de todos os problemas com a tentativa de enviar um monte de mudanças relacionados juntos ao mesmo tempo -. Passando por múltiplos contextos de dados fará com que isso falhar como cada um tenta trabalhar de forma independente