gpt4 book ai didi

c# - EF代码第一个多对多,主键由3个字段组成

转载 作者:行者123 更新时间:2023-11-30 22:21:39 25 4
gpt4 key购买 nike

我正在使用 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 中如何工作。

如能提供任何有关如何处理此问题的示例,我们将不胜感激。

最佳答案

您不能将此映射为多对多关系。您需要三个一对多关系,中间附加实体 Person2Address 表示具有三个键的链接表。 PersonAddress 中的集合必须都引用此中间实体(也可以选择 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);

如果您想在 AddressType 中包含集合,或者在最后一个映射中使用 WithMany(at => at.Person2Addresses)

关于c# - EF代码第一个多对多,主键由3个字段组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14214755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com