コンストラクターメソッドを使用してLINQエンティティクラスを拡張し、そのエンティティクラスがそのDataContextクラスを継承するようにする
-
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つの別個のオブジェクトであり、そのように動作するように設計されています。これを行うと、関連する一連の変更を同時に送信しようとすると、すべての種類の問題が発生します-複数のデータコンテキストを通過すると、それぞれが独立して機能しようとするため、これが失敗します。