c# - 如何实现访问同一个表但排除某些数据的“标题”基类
问题描述
我有一个现有的表 - 例如
create table Users (
Id Int,
UserId varchar(10),
FirstName nvarchar(30),
MiddleName nvarchar(30),
LastName nvarchar(30),
BirthDate datetime,
ProfilePicture varbinary(max),
HeaderPicture varbinary(max)
);
由于ProfilePicture
和HeaderPicture
很大,如果不需要它们,我不想检索它们。以可读性和防止 NullReferenceExceptions 的名义,我想使用两个不同的类——一个只有“标题”信息,一个有完整信息。
以下是我的想法:
[Table("Users")]
public class UserHeader
{
[Key, Display(AutoGenerateField = false)]
[Required]
public int Id { get; set; }
[Required, StringLength(10)]
public string UserId { get; set; }
[Required, StringLength(30)]
public string FirstName { get; set; }
[StringLength(30)]
public string MiddleName { get; set; }
[Required, StringLength(30)]
public string LastName { get; set; }
[Required]
public DateTime BirthDate { get; set; }
}
public class User : UserHeader
{
public byte[] ProfilePicture { get; set; }
public byte[] HeaderPicture { get; set; }
}
当我尝试使用它时,我收到一个错误,即我的表中没有鉴别器列。如果我添加HasNoDiscriminator()
到模型构建器,我会得到一个不同的错误:
实体类型“IncidentHeader”是层次结构的一部分,但没有配置鉴别器属性
我不想要一个鉴别器——每一行都应该可以作为 User 和 UserHeader 检索,这取决于使用哪个 DBSet 来访问它。
有什么方法可以使用 EntityFramework Core 实现这种设置?
解决方案
尝试以下方法
public class UserHeader
{
public int Id { get; set; }
public string UserId { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
public User User { get; set; }
}
public class User
{
public int Id { get; set; }
public byte[] ProfilePicture { get; set; }
public byte[] HeaderPicture { get; set; }
}
使用 fluent 接口将这两个类映射到单个表。
public class DB : DbContext
{
public DbSet<UserHeader> UserHeaders { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserHeader>(uh =>
{
uh.ToTable("Users");
uh.HasOne(uh => uh.User).WithOne()
.HasForeignKey<User>(u => u.Id);
});
modelBuilder.Entity<User>(user =>
{
user.ToTable("Users");
});
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(
ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
}
}
请参阅文档:表拆分
推荐阅读
- php - 从 shortDateFormat 创建完整的 longdate 格式
- java - 获取 java.lang.ClassNotFoundException: org.testng.TestNG 错误
- python - 有没有一种pythonic方法可以从列表中获取两个元素(第一个,第二个)......(最后一个,第一个)
- ios - 在同一个 UICollectionView 中处理多个行为
- python-3.x - 如何在进入下一页时提取数据并将其作为数据框保存到 csv 文件中?我使用的代码只输出 1 页
- javascript - 如何修复 Vue 警告]:未知的自定义元素:
? - java - 如何在jFrame中循环jPanel?
- visual-studio-code - 如何卸载 Python 语言服务器(由 VS Intellicode 扩展安装)
- servicestack - 流利的验证器检查数据库中是否存在具有 ID 的实体
- angular - Aws Cognito + Angular 7 - 如何同时创建用户并将用户分配给用户组