![](/img/trans.png)
[英]What is the correct way to load a collection of a reference of an object in EF Core?
[英]EF Core - load object
我有一個要在我的C#應用程序中使用的SQL Server數據庫。
CREATE TABLE [dbo].[Marks] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[CategoryId] INT NOT NULL,
[Name] NVARCHAR(MAX) NOT NULL,
[Value] DECIMAL(18,3) NOT NULL
)
CREATE TABLE[dbo].[Categories] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR(MAX) NOT NULL,
[Average] decimal(18,3) NOT NULL
)
CREATE TABLE[dbo].[Subjects] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR(MAX) NOT NULL,
[Teacher] NVARCHAR(MAX) NOT NULL
[TestsId] INT NOT NULL,
[WrittenId] INT NOT NULL,
)
我將數據庫表轉換為C#類:
public partial class Marks
{
public int Id { get; set; }
public int SubjectId { get; set; }
public int CategoryId { get; set; }
public string Name { get; set; }
public decimal Value { get; set; }
public Categories Category { get; set; }
public Subjects Subject { get; set; }
}
public partial class Subjects
{
public int Id { get; set; }
public string Name { get; set; }
public string Teacher { get; set; }
public ICollection<Marks> Marks { get; set; }
}
public partial class Categories
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Marks> Marks { get; set; }
}
我想獲得一個主題,然后為每個類別分配相應的分數。 對於每個主題,應該有多個類別。 如何使用Entity Framework Core 2.0實現此目標?
馬克是您的多對多表格,您說每個主題應該有多個類別。
我使用內存提供程序編寫了代碼。 您可以像這樣更改表結構。
首先,所有實體命名都必須是單數。
您的實體應如下所示;
public class Subject
{
public Subject()
{
Marks = new List<Mark>();
Categories = new List<Category>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Teacher { get; set; }
public ICollection<Mark> Marks { get; set; }
public ICollection<Category> Categories { get; set; }
}
public class Category
{
public Category()
{
Marks = new List<Mark>();
}
public int Id { get; set; }
public string Name { get; set; }
public int SubjectId { get; set; }
public Subject Subject { get; set; }
public ICollection<Mark> Marks { get; set; }
}
public class Mark
{
public int Id { get; set; }
public int SubjectId { get; set; }
public int CategoryId { get; set; }
public string Name { get; set; }
public decimal Value { get; set; }
public Category Category { get; set; }
public Subject Subject { get; set; }
}
然后,您的DataContex應該如下所示;
public class AppDataContext : DbContext
{
public AppDataContext(DbContextOptions<AppDataContext> options)
: base(options)
{
}
public DbSet<Subject> Subjects { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Mark> Marks { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Category>().HasMany(c => c.Marks).WithOne(m => m.Category).HasForeignKey(m => m.CategoryId);
modelBuilder.Entity<Subject>().HasMany(s => s.Marks).WithOne(m => m.Subject).HasForeignKey(m => m.SubjectId);
modelBuilder.Entity<Subject>().HasMany(s => s.Categories).WithOne(c => c.Subject).HasForeignKey(c => c.SubjectId);
}
}
因此,示例代碼如下;
static void Main(string[] args)
{
var context = new AppDataContext(new DbContextOptionsBuilder<AppDataContext>().UseInMemoryDatabase("test")
.Options);
var category11 = new Category {Id = 11, Name = "Category-11"};
var subject22 = new Subject {Id = 22, Name = "Subject-22"};
subject22.Categories.Add(category11);
var mark1 = new Mark
{
Id = 1,
Name = "Mark-1",
CategoryId = 11,
SubjectId = 22,
Category = category11,
Subject = subject22
};
context.Categories.Add(category11);
context.Subjects.Add(subject22);
context.Marks.Add(mark1);
context.SaveChanges();
var markList = context.Marks.ToList();
foreach (var mark in markList)
{
Console.WriteLine(mark.Name);
Console.WriteLine(mark.Subject.Categories.FirstOrDefault().Name);
}
Console.ReadKey();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.