这是我的模特
|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|
我想要以下数据库结构:
表公司
表格办公室
Table BranchOffice
我该怎么做?
当我创建此迁移时,EF只创建一个包含所有列的表!我不想要这种方法!
答案 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和文档
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; }
}
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; }
}