2017-10-25 3 views
1

C# 응용 프로그램에서 사용하려는 SQL 서버 데이터베이스가 있습니다.EF 코어로드 객체

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; } 
} 

내가 한 과목 다음 각 카테고리에 해당하는 점수를 얻으려면 :

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# 클래스와 데이터베이스 테이블을 변환. 모든 제목에는 여러 개의 범주가 있어야합니다. Entity Framework Core 2.0에서이를 어떻게 달성합니까?

답변

2

마크는 여러 테이블에 해당하며 모든 제목에는 여러 카테고리가 있어야한다고 말합니다.

나는 메모리 내 공급자를 사용하여 코드를 작성했습니다. 이런 식으로 테이블 구조로 변경할 수 있습니다.

먼저 모든 엔티티 이름을 단수로 지정해야합니다.

엔티티는 다음과 같아야합니다.

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; } 
} 

그러면 DataContext는 다음과 같아야합니다.

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(); 
}