gpt4 book ai didi

c# - CTP 4 不考虑基类属性

转载 作者:行者123 更新时间:2023-11-30 22:42:34 26 4
gpt4 key购买 nike

在下面的示例中,CTP 仅考虑用户类属性,但我希望用户表中包含基类属性。

有没有办法告诉 CTP 包含基类属性?或者有什么替代解决方案?

class PersonDBContext : DbContext
{
public DbSet<User> UserSet { get; set; }
}
class Person
{
public string Firstname { get; set; }
public string SurName { get; set; }
}
class User : Person
{
public int UserId { get; set; }
public string CreatedOn { get; set; }
}

最佳答案

那是因为你声明了DbSet<User>在你的 DbContext 而不是 DbSet<Person> .当谈到继承时,EF 代码首先有一个可达性 的概念,这基本上意味着如果您将一组基类放在上下文中,它将向下查找并包含其所有子类。

这里还有一个问题:您没有为 Person 指定主键class 和 EF 也无法根据 Code First 约定推断出一个。默认情况下,EF 将模型中的继承映射到数据库中的 TPH(Type Per Hierarchy),子类从其基类继承 key ,该基类已放入模型中的子类(即 UserId)中。

为了解决这个问题,我们首先将 DbContext 上的 DbSet 更改为 Person 类型然后我们需要向上移动UserIdPerson基类并使其成为 Key,如下所示:

public class Person 
{
[Key]
public int UserId { get; set; }

public string Firstname { get; set; }
public string SurName { get; set; }
}

public class User : Person
{
public string CreatedOn { get; set; }
}

public class PersonDBContext : DbContext
{
public DbSet<Person> UserSet { get; set; }
}

此模型将产生以下数据库模式,其中包含来自两个类的所有列(注意复数支持):

alt text

如何在 Code First 中将 TPH 更改为 TPT(Table Per Hierarchy):

就像我说的,按照惯例,EF 代码首先将使用 TPH 将继承映射到数据库并将其更改为 TPT,我们需要使用 Fluent API 覆盖这些约定:

public class StackOverflowContext : DbContext
{
public DbSet<Person> Persons { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>().MapHierarchy(p => new
{
p.UserId,
p.Firstname,
p.SurName,
})
.ToTable("Person");

modelBuilder.Entity<User>().MapHierarchy(u => new
{
u.UserId,
u.CreatedOn
})
.ToTable("User");
}
}

此模型将产生以下数据库架构:

alt text

如何在 Code First 中将 TPH 更改为 TPC(Table Per Concrete Type):

在 Table per Concrete Class 中,每个类都有一个表,每个表都有该类型的每个属性的列。

相关代码如下所示,请注意,我关闭了主键属性的标识,因为两个表之间没有外键,我们需要注意提供唯一键。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>().Property(p => p.UserId)
.StoreGeneratedPattern = System.Data.Metadata.Edm.StoreGeneratedPattern.None;

modelBuilder.Entity<Person>().MapSingleType(p => new
{
p.UserId,
p.Firstname,
p.SurName,
})
.ToTable("Person");

modelBuilder.Entity<User>().MapSingleType(u => new
{
u.UserId,
u.CreatedOn,
u.Firstname,
u.SurName,
})
.ToTable("User");
}

此模型将产生以下数据库架构: alt text

关于c# - CTP 4 不考虑基类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com