实体框架核心2.0中每种类型的表

时间:2017-12-09 21:03:37

标签: c# entity-framework entity-framework-core

这是我的模特

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|

我想要以下数据库结构:

表公司

  • CompanyId(PK)
  • 名称
  • 地址
  • 电子邮件
  • 地址

表格办公室

  • HeadOfficeId(PK)
  • CompanyId(FK)

Table BranchOffice

  • BranchOfficeId(PK)
  • HeadOfficeId(FK)
  • CompanyId(FK)

我该怎么做?

当我创建此迁移时,EF只创建一个包含所有列的表!我不想要这种方法!

2 个答案:

答案 0 :(得分:0)

您必须将模型更改为如下所示,请注意,您不能使用这种方法使用继承:

public class Company
{
   public int CompanyId { get; set; }
   //...
}

public class Company
{
   public int CompanyId { get; set; }
   public string Name { get; set; }
   //...
}

public class HeadOffice
{
   [ForeignKey(nameof(Company))]
   public int CompanyId { get; set; }
   public Company Company { get; set; }
   // Add Properties here
}

public class BranchOffice
{
   [ForeignKey(nameof(Company))]
   public int CompanyId { get; set; }
   public Company Company { get; set; }
   // Add Properties here
}

您的DbContext

public class YourContext : DbContext
{
  public DbSet<Company> Companys { get; set; }
  public DbSet<HeadOffice> HeadOffices { get; set; }
  public DbSet<BranchOffice> BranchOffices { get; set; }

  public YourContext(DbContextOptions<YourContext> options)
    : base(options)
  {
  }
}

然后可以使用EF Core Migrations。命令看起来像这样:

dotnet ef migrations add Initial_TPT_Migration -p ./../../ModelProject.csproj -s ./../../ModelProject.csproj -c YourContext -o ./TptModel/CodeFirst/Migrations

它产生了一个类Initial_TPT_Migration,其中包含用于生成数据库的方法。

用法

要进行查询,您需要将“公司属性”映射到字段名称。如果将此方法与存储库模式link)结合使用,则实际上可能与EF Core当前使用的默认方法一样方便。

YourContext ctx = ...

// Fetch all BranchOffices
var branchOffices = ctx.BranchOffices
          .Select(c => new BranchOffice()
                  {
                    CompanyId = c.CompanyId,
                    Name = c.Company.Name,
                  })
          .ToList();

您可以找到有关此方法here的更多信息。

答案 1 :(得分:-2)

您可以在这里https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance?view=aspnetcore-2.1

找到答案

如果需要针对一个表的许多继承的类,还请检查本主题 https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance

在此处复制代码,以防万一Microsoft曾经弄乱url和文档

  1. 每个表的每个继承类型
public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }

    public DbSet<Student> Students { get; set; }
    public DbSet<Instructor> Instructors { get; set; }
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder b)
    {
        b.Entity<Student>().ToTable("Student");
        b.Entity<Instructor>().ToTable("Instructor");
        b.Entity<Person>().ToTable("Person");
    }
}

public abstract class Person
{
    public int ID { get; set; }

    public string LastName { get; set; }
    public string FirstMidName { get; set; }
}

public class Instructor : Person
{
    public DateTime HireDate { get; set; }
}

public class Student : Person
{
    public DateTime EnrollmentDate { get; set; }
}
  1. 一个表中有许多继承的类型
public class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasDiscriminator<string>("blog_type")
            .HasValue<Blog>("blog_base")
            .HasValue<RssBlog>("blog_rss");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}