2

私は EF5 (Code 1st) を使用しており、すべての構成を Fluent API で行っています。私のモデルは次のようになります。

public class AddressType    
{
    public int    AddressTypeID { get; set; }
    public string Name          { get; set; }
}
public class Address
{
    public int    AddressID  { get; set; }
    public int    StateID    { get; set; }

    public string Street     { get; set; }
    public string City       { get; set; }
    public string PostalCode { get; set; }

    public State State                { get; set; }
    public ICollection<Person> People { get; set; }
}
public class Person
{
    public int      PersonID    { get; set; }
    public string   Name        { get; set; }

    public ICollection<Address> Addresses { get; set; }
}

私のデータベースには、上記のクラスのテーブル + 以下の Many:Many テーブルが含まれています。

Person.Person2Address
(
    PersonID      INT NOT NULL,
    AddressID     INT NOT NULL,
    AddressTypeID INT NOT NULL,
)

上記の 3 つのフィールドはすべて外部キーであり、3 つが一緒になってテーブルの主キーを構成します。

通常、私の M:M セットアップでは、PK に 2 つのフィールドのみが含まれます。そして、私はそれを次のようにマッピングします:

var addressCfg = mb.Entity<Address>();
addressCfg.ToTable("Address", "Geo");
addressCfg.HasMany(a => a.People)
          .WithMany(p => p.Addresses)
          .Map(mmc =>
          {
             mmc.ToTable("Person2Address", "Person");
             mmc.MapLeftKey("AddressID");
             mmc.MapRightKey("PersonID");
          });

しかし、PK でこの 3 番目のフィールドを構成する方法や、この場合、EF で CRUD がどのように機能するかはわかりません。

これがどのように処理されるべきかの例は大歓迎です。

4

1 に答える 1

3

これを多対多の関係としてマップすることはできません。3つのキーを持つリンク テーブルを表す中間追加エンティティとの1 対多の関係が 3 つ必要です。とPerson2Addressのコレクションは両方とも、この中間エンティティ (およびオプションで のコレクション) を参照する必要があります。PersonAddressAddressType

モデルは次のようになります。

public class AddressType
{
    public int AddressTypeID { get; set; }
    public string Name { get; set; }

    // public ICollection<Person2Address> Person2Addresses { get; set; }
    // optionally you can include this collection or not
}

public class Address
{
    public int AddressID { get; set; }
    public int StateID { get; set; }

    public string Street { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }

    public State State { get; set; }
    public ICollection<Person2Address> Person2Addresses { get; set; }
}

public class Person
{
    public int PersonID { get; set; }
    public string Name { get; set; }

    public ICollection<Person2Address> Person2Addresses { get; set; }
}

public class Person2Address
{
    public int PersonID { get; set; }
    public int AddressID { get; set; }
    public int AddressTypeID { get; set; }

    public Person Person { get; set; }
    public Address Address { get; set; }
    public AddressType AddressType { get; set; }
}

Fluent API を使用したマッピング:

modelBuilder.Entity<Person2Address>()
    .HasKey(p2a => new { p2a.PersonID, p2a.AddressID, p2a.AddressTypeID });

modelBuilder.Entity<Person2Address>()
    .HasRequired(p2a => p2a.Person)
    .WithMany(p => p.Person2Addresses)
    .HasForeignKey(p2a => p2a.PersonID);

modelBuilder.Entity<Person2Address>()
    .HasRequired(p2a => p2a.Address)
    .WithMany(a => a.Person2Addresses)
    .HasForeignKey(p2a => p2a.AddressID);

modelBuilder.Entity<Person2Address>()
    .HasRequired(p2a => p2a.AddressType)
    .WithMany()
    .HasForeignKey(p2a => p2a.AddressTypeID);

またはWithMany(at => at.Person2Addresses)、コレクションを に含めたい場合は、最後のマッピングで使用しますAddressType

于 2013-01-08T20:02:35.850 に答える