EF Core 中的接口

问题描述 投票:0回答:1

我正在用 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#的新手,可能有更好的方法来处理这种情况,请告诉我是否有更好的方法。我的一个属性(封装)应该根据另一个属性(组装技术)进行更改,并且我宁愿没有两种电阻器,因为它们有很多共同点,一个类似乎就足够了。

c# sqlite entity-framework-core interface
1个回答
0
投票

创建一个简单的 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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.