试图找出对稍微复杂的 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外键,所以PCAssetNonPCAsset的主键也是Asset的主键,还有AssetType列,每个子表都是固定的(计算列)。这有时被称为 Table-per-Type 继承 @Charlieface 只是为了澄清,没有一个名为 NonPCAsset 的实体。资产表包含将具有 PC 详细信息的资产和不需要 PC 详细信息的非 PC 资产。实体是 AssetsAssetTypeCPUMemoryPCDetails 我的意思是您可以考虑将两种不同类型的资产拆分为不同的类型。老实说,我不完全确定您的问题是什么,这只是一个建议 @Charlieface 哦好吧,我没想到!感谢您的建议。 【参考方案1】:

我会在 PCDetails 中包含一个链接到 Assets 表的列作为外键。您可以将业务逻辑添加到您的 UI 以显示更改/添加/删除“PC”类型的资产详细信息的选项。

【讨论】:

我正在考虑将逻辑放在 UI 中,但后来我想起来了,这是不好的做法。 :)

以上是关于试图找出对稍微复杂的 SQL 数据库执行 CRUD 操作的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 详解------动态SQL

myBatis架构以及SQlSessionFactory,SqlSession,通过代理执行crud源码分析---待更

基于Spring Boot,使用JPA动态调用Sql查询数据

MyBatis学习总结——使用MyBatis对表执行CRUD操作

MyBatis学习总结——使用MyBatis对表执行CRUD操作

一些稍微复杂点的sql语句