-1

これらの既存のテーブルを以下のクラスにマップするにはどうすればよいですか?

私は次のテーブルを持っています:

CREATE TABLE dbo.UserContact (
  UserContactId int NOT NULL IDENTITY (1, 1),
  UserId int NOT NULL,
  ContactId int NOT NULL,
  UserContactTypeId int NOT NULL,
  FromDt datetime NULL,
  ThruDt datetime NULL,
  CreateDt datetime NOT NULL,
  UpdateDt datetime NULL,
  IsDeleted bit NULL,
  CanSolicit bit NOT NULL
) 

CREATE TABLE dbo.Contact (
  ContactId int NOT NULL IDENTITY (1, 1),
  CreateDt datetime NOT NULL,
  UpdateDt datetime NULL
)

CREATE TABLE dbo.Electronic (
  ContactId int NOT NULL,
  URL nvarchar(512) NOT NULL,
  ElectronicType smallint NULL
)

CREATE TABLE dbo.Phone (
  ContactId int NOT NULL,
  AreaCode nchar(3) NOT NULL,
  PhoneNb nchar(7) NOT NULL,
  Extension nchar(6) NULL,
  PhoneType smallint NULL
)

CREATE TABLE dbo.Postal
(
  ContactId int NOT NULL,
  Street nvarchar(256) NOT NULL,
  Specifier nvarchar(256) NULL,
  GeocodeId int NULL
)

Electronic、Phone、Postalの各テーブルは、Contactと1対1の関係にあります。テーブルUserContactは、Contactと多対1になっています。UserContactは、UserとContactの間の関連付けテーブルです。

次のクラスもあります。

public class Electronic : IntegerKeyEntity
{
    public virtual ContactId { get; set; }
    public virtual DateTime CreateDt { get; set; }
    public virtual DateTime? UpdateDt { get; set; }
    public string Url { get; set; }
    public ElectronicType Type { get; set; }
}

public class Postal : IntegerKeyEntity
{
    public virtual ContactId { get; set; }
    public virtual DateTime CreateDt { get; set; }
    public virtual DateTime? UpdateDt { get; set; }
    public string Street { get; set; }
    public string Specifier { get; set; }
    public Geocode Geocode { get; set; }
}

public class Phone : IntegerKeyEntity
{
    public virtual ContactId { get; set; }
    public virtual DateTime CreateDt { get; set; }
    public virtual DateTime? UpdateDt { get; set; }
    public string AreaCode { get; set; }
    public string PhoneNb { get; set; }
    public string Extension { get; set; }
    public PhoneType Type { get; set; }
}

public class UserContact : IntegerKeyEntity
{
    private ICollection<Electronic> electronics = new HashSet<Electronic>();
    private ICollection<Phone> phones = new HashSet<Phone>();
    private ICollection<Postal> postals = new HashSet<Postal>();

    // props

    public virtual IEnumerable<Electronic> Electronics { get { return electronics; } }
    public virtual IEnumerable<Phone> Phones { get { return phones; } }
    public virtual IEnumerable<Postal> Postals { get { return postals; } }
}

それで、私は4つの連絡先テーブル(親と子)から3つのクラスに至るまで取得しますか?そして、これら3つのクラスをUserContactテーブルにマップするにはどうすればよいですか。クラスごとに1つずつ、合計3つのIListを持つことができると想定しています。

4

1 に答える 1

1

これを間違ってモデリングしていると思います。Electronic、Phone、PostalはContactを拡張(継承)しているように見えます。これはドメインモデルで表現する必要があります。これらのクラスは、Contactと1対1で関連しているのではなく、抽象Contactタイプを拡張する具象タイプです。この方法でモデル化すると、サブクラスごとのテーブル継承マッピングを使用してContactをマッピングできます。

その場合、ユーザーは連絡先と多対多の関係を持ち、ユーザーの連絡先コレクションには任意のタイプの連絡先が含まれます。

個人的には、すべての連絡先タイプを1つのテーブルにまとめ、より単純なクラスごとのテーブルマッピングを使用します。

于 2010-11-19T12:58:45.470 に答える