2017-10-25 4 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; } 
} 

は、私は1つの対象とし、各カテゴリの対応するマークを取得したい:

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