gpt4 book ai didi

c# - 同一类型的 Entity Framework 多个集合

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

我正在尝试创建一个包含两个相同类型集合的类。但是,当我阅读其中一个集合时,我会从两个集合中获取数据。这意味着,我的 Fluent API 配置一定有问题。

在 LINQPad 中,我可以看到集合“Alternatives”和“Answers”已合并为一个“PageElements”集合。

示例代码

class Program
{
static void Main(string[] args)
{
var alternatives = new List<PageElement>
{
new PageElement {Data = "Alternative 1"},
new PageElement {Data = "Alternative 2"},
new PageElement {Data = "Alternative 3"},
new PageElement {Data = "Alternative 4"},
};

var answers = new List<PageElement>
{
new PageElement { Data = "Answer 1" },
new PageElement { Data = "Answer 2" },
};

var page = new Page
{
Alternatives = alternatives,
Answers = answers
};


using (var context = new MyContext())
{
context.Pages.Add(page);
context.SaveChanges();

var loadedPage = context.Pages.First();

foreach (var answer in loadedPage.Answers)
{
Console.WriteLine("Answer: " + answer.Data);
}

}


Console.ReadLine();
}
}



public class MyContext : DbContext
{
public DbSet<Page> Pages { get; set; }

public MyContext()
{

}

protected override void OnModelCreating(DbModelBuilder mb)
{

mb.Entity<PageElement>()
.HasRequired(p => p.Page)
.WithMany(p => p.Alternatives)
.HasForeignKey(p => p.PageId);

mb.Entity<PageElement>()
.HasRequired(p => p.Page)
.WithMany(p => p.Answers)
.HasForeignKey(p => p.PageId);

}

}

public class Page
{
public int Id { get; set; }
public virtual ICollection<PageElement> Alternatives { get; set; }
public virtual ICollection<PageElement> Answers { get; set; }
}

public class PageElement
{
public int Id { get; set; }
public int PageId { get; set; }
public virtual Page Page { get; set; }

public string Data { get; set; }
}

输出

Answer: Alternative 1
Answer: Alternative 2
Answer: Alternative 3
Answer: Alternative 4
Answer: Answer 1
Answer: Answer 2

期望的输出

Answer: Answer 1
Answer: Answer 2

最佳答案

这是因为您的备选方案和答案都存储在一个表 PageElements 中 - 即使您分别构建它们,一旦它们进入数据库,它们就会一起保存。因此,当重新加载时,EF 无法将它们拆分回两组。

一个简单的解决方案是将它们拆分为两种类型,例如 AlternativeElementAnswerElement,这将因此创建两个表,从而避免该问题。

编辑

回答您的后续问题:您可以遵循派生类的模式,即使子类不添加新字段。然后使用 Table per Hierarchy模式,所以你只有一个数据库表,其中有一列指示每一行属于哪个子类。,所以:

public class PageElement
{
public int Id { get; set; }
public int PageId { get; set; }
public virtual Page Page { get; set; }

public string Data { get; set; }
}

public class PageElementAnswer : PageElement
{
}

public class PageElementAlternative : PageElement
{
}

public class Page
{
public int Id { get; set; }
public virtual ICollection<PageElementAlternative> Alternatives { get; set; }
public virtual ICollection<PageElementAnswer> Answers { get; set; }
}

关于c# - 同一类型的 Entity Framework 多个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612800/

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