gpt4 book ai didi

entity-framework - Entity Framework 代码优先 : how to map multiple self-referencing many-to-many relationships

转载 作者:行者123 更新时间:2023-12-04 07:37:23 25 4
gpt4 key购买 nike

我创建了一个实体类型,它具有多个引用相同类型项目的集合属性。换句话说,它反射(reflect)了一个数据库表,其中的行被任意分组,这样一行可能出现在多个组中。

在以下简化示例中,Person类(class)有BrothersSisters也引用 Person 的集合属性实体:

public class Person
{
public Person()
{
Brothers = new Collection<Person>();
Sisters = new Collection<Person>();
}

[Key]
public string Name { get; set; }

public int Age { get; set; }

public virtual ICollection<Person> Brothers { get; set; }

public virtual ICollection<Person> Sisters { get; set; }
}

Entity Framework 似乎认为这是一个有效的模型,但将其解释为创建单个 PersonPersons join表,不能体现 sibling 关系的分离。

我认为解决方案是使用 fluent API 为两个关系显式映射单独的连接表,但是,尽管进行了大量实验,我还是无法让它工作。

请问有什么建议吗?

谢谢,
蒂姆

最佳答案

通过在 DbContext.OnModelCreating 方法中添加:

更新 根据上面 nameEqualsPNamePrubeGoldberg 的评论添加了表命名映射:

modelBuilder.Entity<Person>().HasMany(x => x.Brothers).WithMany()
.Map(x => x.ToTable("Person_Brothers"));
modelBuilder.Entity<Person>().HasMany(x => x.Sisters).WithMany()
.Map(x => x.ToTable("Person_Sisters"));

我让这个单元测试通过了
[TestMethod]
public void TestPersons()
{
var brother = new Person() { Name = "Brother 1", Age = 10 };
var sister = new Person() { Name = "Sister 1", Age = 12 };
var sibling = new Person() { Name = "Sibling 1", Age = 18 };
sibling.Brothers.Add(brother);
sibling.Sisters.Add(sister);

using (var db = new MyDatabase())
{
db.Persons.Add(brother);
db.Persons.Add(sister);
db.Persons.Add(sibling);

db.SaveChanges();
}

using (var db = new MyDatabase())
{
var person = db.Persons
.Include(x => x.Sisters)
.Include(x => x.Brothers)
.FirstOrDefault(x => x.Name.Equals(sibling.Name));

Assert.IsNotNull(person, "No person");
Assert.IsTrue(person.Brothers.Count == 1, "No brothers!");
Assert.IsTrue(person.Sisters.Count == 1, "No sisters");
}
}

这也会创建您正在谈论的链接表。

关于entity-framework - Entity Framework 代码优先 : how to map multiple self-referencing many-to-many relationships,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930715/

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