2

我正在使用 EF5(代码 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 中配置第三个字段,或者在这种情况下 CRUD 甚至在 EF 中如何工作。

任何应该如何处理的例子都将不胜感激。

4

1 回答 1

3

您不能将此映射为多对多关系。您需要三个一对多关系以及一个中间附加实体,该实体Person2Address表示具有三个键的链接表。Person和中的集合Address必须都引用此中间实体(并且还可以选择引用 中的集合AddressType)。

该模型将是这样的:

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 回答