试图找出对稍微复杂的 SQL 数据库执行 CRUD 操作的最佳方法
Posted
技术标签:
【中文标题】试图找出对稍微复杂的 SQL 数据库执行 CRUD 操作的最佳方法【英文标题】:Trying to figure out the best approach to perform CRUD operations for a slightly complex SQL database 【发布时间】:2021-10-08 04:21:16 【问题描述】:我目前正在开发一个带有 MSSQL 数据库后端的 C# dot net core MVC 项目。我采用了数据优先的方法。这是我的 dbcontext 的简化示例。
//dbcontext//
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace redux.web.Models
public partial class assetsdbContext : DbContext
public assetsdbContext()
public assetsdbContext(DbContextOptions<assetsdbContext> options)
: base(options)
public virtual DbSet<AssetType> AssetType get; set;
public virtual DbSet<Assets> Assets get; set;
public virtual DbSet<Cpu> Cpu get; set;
public virtual DbSet<Memory> Memory get; set;
public virtual DbSet<Pcdetails> Pcdetails get; set;
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<AssetType>(entity =>
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.DisplayName)
.HasMaxLength(50)
.IsUnicode(false);
);
modelBuilder.Entity<Assets>(entity =>
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.AssetNo)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.AssetTypeId).HasColumnName("AssetTypeID");
entity.Property(e => e.DisplayName)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.PcdetailsId).HasColumnName("PCDetailsID");
);
modelBuilder.Entity<Cpu>(entity =>
entity.ToTable("CPU");
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.DisplayName)
.HasMaxLength(50)
.IsUnicode(false);
);
modelBuilder.Entity<Memory>(entity =>
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.DisplayName)
.HasMaxLength(50)
.IsUnicode(false);
);
modelBuilder.Entity<Pcdetails>(entity =>
entity.ToTable("PCDetails");
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.Cpuid).HasColumnName("CPUID");
entity.Property(e => e.MemoryId).HasColumnName("MemoryID");
);
OnModelCreatingPartial(modelBuilder);
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
我现在的问题是在输入新资产时如何处理 PC 详细信息,因为会有 PC 和非 PC 资产。我想我可能需要在 create 方法的 if 语句中使用 AssetType ?或者我可以以更好的方式设计数据库吗?任何想法都将不胜感激。
【问题讨论】:
听起来你想要一个0:1
外键,所以PCAsset
和NonPCAsset
的主键也是Asset
的主键,还有AssetType
列,每个子表都是固定的(计算列)。这有时被称为 Table-per-Type 继承
@Charlieface 只是为了澄清,没有一个名为 NonPCAsset 的实体。资产表包含将具有 PC 详细信息的资产和不需要 PC 详细信息的非 PC 资产。实体是 Assets、AssetType、CPU、Memory 和 PCDetails
我的意思是您可以考虑将两种不同类型的资产拆分为不同的类型。老实说,我不完全确定您的问题是什么,这只是一个建议
@Charlieface 哦好吧,我没想到!感谢您的建议。
【参考方案1】:
我会在 PCDetails 中包含一个链接到 Assets 表的列作为外键。您可以将业务逻辑添加到您的 UI 以显示更改/添加/删除“PC”类型的资产详细信息的选项。
【讨论】:
我正在考虑将逻辑放在 UI 中,但后来我想起来了,这是不好的做法。 :)以上是关于试图找出对稍微复杂的 SQL 数据库执行 CRUD 操作的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
myBatis架构以及SQlSessionFactory,SqlSession,通过代理执行crud源码分析---待更
基于Spring Boot,使用JPA动态调用Sql查询数据
MyBatis学习总结——使用MyBatis对表执行CRUD操作