我正在用 C# 为我的实验室创建一个小型库存应用程序。
这是关于电子元件的,我在弄清楚数据库布局时遇到一些困难。
您会看到每个组件都有一个封装,如果其组装技术是 SMD 或 DIP,则封装会发生变化。每个 SMD 和 DIP 都有自己的选项,因此我创建了一个 SMD 类和一个 DIP 类,以及一个接口来作为它们的父级并在主电阻模型中使用。
之后,我想放一个关系映射,一对多。这样电阻器也可以在其包装上搜索到!
现在看看这些模型:
public class Resistors
{
public string Value { get; set; }
public int Tolerance { get; set; }
public IResistorPackage Package { get; set; }
public ResistorAT AssembleTech{ get; set; }
}
这里有一个界面,它有两个像这样的子元素:
public class ResistorPackageDIP : IResistorPackage
{
public int Id { get; set ; }
public string RP250mW { get; set; }
public string RP500mW { get; set; }
public string RP1W { get; set; }
public string RP2W { get; set; }
}
public class ResistorPackageSMD : IResistorPackage
{
public int Id { get; set; }
public string RP1206 { get; set; }
public string RP0805 { get; set; }
public string RP0603 { get; set; }
public string RP0402 { get; set; }
}
现在基于“Is a”角色,我可以说它们都是包,我想根据
IResistorAT
属性进行保存。我这样做的主要原因之一是,当有人试图向数据库添加电阻时,如果他们选择 SMD,他们应该得到一个组合框,他们可以选择与 SMD AKA 0603 相关的封装,如果他们选择 DIP,他们将被建议DIP相关封装,如果我把它们全部放在一起他们可能会选择错误的封装和组装技术,例如电阻没有0805的DIP。
所以我认为在数据模型上放置一个接口是可以的,因为它都是关于 ID 的,它是一个整数,它不应该有问题,但是,我从 EF Core 收到此消息
System.InvalidOperationException:“属性“Resistors.Package”属于接口类型(“IResistorPackage”)。如果它是导航,请通过将其转换为映射的实体类型来手动配置此属性的关系。否则,请使用 [NotMapped] 属性或“OnModelCreating”中的“Ignore”忽略该属性。'
此异常发生在数据库的
EnsureCreate
函数中。
我是数据库设计和C#的新手,可能有更好的方法来处理这种情况,请告诉我是否有更好的方法。我的一个属性(封装)应该根据另一个属性(组装技术)进行更改,并且我宁愿没有两种电阻器,因为它们有很多共同点,一个类似乎就足够了。
创建一个简单的 SQLite 数据库,如下所示
// Create a table named Resistors to store resistor data (Sql lite).
CREATE TABLE Resistors (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Value TEXT NOT NULL,
Tolerance REAL NOT NULL,
Type TEXT NOT NULL,
PowerRating REAL NOT NULL,
PackageType TEXT NOT NUL,
-- Add more columns as needed
);
// Ensure you have the necessary packages installed in your project (VS 2022):
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Tools
// Create a Resistor class that represents your resistor entity:
public class Resistor
{
public int Id { get; set; } // Primary key
public string Value { get; set; } // Value of the resistor (e.g., "10K")
public double Tolerance { get; set; } // Tolerance percentage (e.g., 5 for ±5%)
public string Type { get; set; } // Type of resistor (SMD, DIP, etc.)
public double PowerRating { get; set; } // PowerRating of the resistor (e.g., 250mW, 1W, 2W, etc)
public string PackageType { get; set; } // e.g., "0402", "0603", "0805", "DIP-8", "DIP-16"
}
// Set up your ResistorDbContext to define the database context and specify the Resistors table:
public class ResistorDbContext : DbContext
{
public DbSet<Resistor> Resistors { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=resistors.db"); // SQLite connection string
}
}
// Generate migrations and apply them to create the database schema:
dotnet ef migrations add InitialCreate
dotnet ef database update
// Create a service or repository class (ResistorService in this example) to encapsulate CRUD operations:
public class ResistorService
{
private readonly ResistorDbContext _context;
public ResistorService(ResistorDbContext context)
{
_context = context;
}
// Create operation
public void AddResistor(Resistor resistor)
{
_context.Resistors.Add(resistor);
_context.SaveChanges();
}
// Read operations
public List<Resistor> GetAllResistors()
{
return _context.Resistors.ToList();
}
public Resistor GetResistorById(int id)
{
return _context.Resistors.Find(id);
}
// Update operation
public void UpdateResistor(Resistor resistor)
{
_context.Resistors.Update(resistor);
_context.SaveChanges();
}
// Delete operation
public void DeleteResistor(int id)
{
var resistor = _context.Resistors.Find(id);
if (resistor != null)
{
_context.Resistors.Remove(resistor);
_context.SaveChanges();
}
}
}
// Here’s how you might use the ResistorService in your application:
class Program
{
static void Main(string[] args)
{
using (var context = new ResistorDbContext())
{
var service = new ResistorService(context);
// Create
var newResistor = new Resistor
{
Value = "10K",
Tolerance = 5,
Type = "SMD",
PowerRating = 0.25
PackageType = "0402"
};
service.AddResistor(newResistor);
// Read all
var allResistors = service.GetAllResistors();
foreach (var resistor in allResistors)
{
Console.WriteLine($"ID: {resistor.Id}, Value: {resistor.Value}, Tolerance: {resistor.Tolerance}, Type: {resistor.Type}, PowerRating: {resistor.PowerRating}, PackageType: {resistor.PackageType}");
}
// Update
var resistorToUpdate = service.GetResistorById(1);
if (resistorToUpdate != null)
{
resistorToUpdate.Tolerance = 1; // Change tolerance to 1%
service.UpdateResistor(resistorToUpdate);
}
// Delete
service.DeleteResistor(2); // Assuming resistor with ID 2 exists and is to be deleted
}
}
}