有没有办法在另一个具有附加属性的模型中使用 DbSet?

Posted

技术标签:

【中文标题】有没有办法在另一个具有附加属性的模型中使用 DbSet?【英文标题】:Is there a way to use a DbSet in another model with additional properties? 【发布时间】:2021-05-09 00:05:24 【问题描述】:

在我的 UWP 应用程序中,我有一个名为 Product.cs 的模型:

public class Product : IEquatable<Product>

    public string ProductName  get; set; 
    public double PricePerPiece  get; set; 
    public double PricePerKilogram  get; set; 
    public double Iva  get; set; 
    public double ContainerPrice  get; set; 
    public string ContainerType  get; set; 
    public Guid ProductId  get; set;  = Guid.NewGuid();

    public bool Equals(Product otherProduct)
    
        return
            this.ProductName == otherProduct.ProductName &&
            this.PricePerPiece == otherProduct.PricePerPiece &&
            this.PricePerKilogram == otherProduct.PricePerKilogram &&
            this.Iva == otherProduct.Iva &&
            this.ContainerPrice == otherProduct.ContainerPrice &&
            this.ContainerType == otherProduct.ContainerType;
    

我基于此模型创建了一个 DbSet,并将其用作 View 中 DataGrid 的 ItemSource。

public class MarketContext : DbContext

    /// <summary>
    /// Creates a new DbContext.
    /// </summary>
    public MarketContext(DbContextOptions<MarketContext> options) : base(options)
     

    /// <summary>
    /// Gets the customers DbSet.
    /// </summary>
    public DbSet<Customer> Customers  get; set; 

    /// <summary>
    /// Gets the products DbSet.
    /// </summary>
    public DbSet<Product> Products  get; set; 

现在我想在不同的视图中有另一个 DataGrid,它显示 ProductName、PricePerPiece 以及数量和总价格(数量 * PricePerPiece)。每个产品的数量由用户插入,而总价格列必须自动更新其内容。 我尝试的解决方案是使用 Quantity 和 TotalPrice 属性创建另一个名为 LineProduct.cs 的模型,但我不知道如何将它们与存储在数据库中的产品相关联并在单个 DataGrid 中显示所有这四列。

public class LineProduct

    public string ProductName  get; set; 
    public double PricePerPiece  get; set; 
    public double Quantity  get; set; 
    public double TotalPrice  get; set; 
    public Guid LineProductId  get; set;  = Guid.NewGuid();

LineProduct 类中的 ProductName 和 PricePerPiece 属性必须从我在数据库中创建的 Products 表中检索内容。 目标是允许用户在一个视图中添加、更新或删除产品(这部分工作正常)并在另一个视图中使用该产品进行计算,并最终使用 DbSet 将其保存在数据库中。

【问题讨论】:

您能否向我们展示您在问题中提到的代码 我刚刚编辑了这个问题。谢谢 要“提供”第二个视图的 DataGrid,您需要一个为您返回数据的查询(您可以使用您的 LineProduct 类型)。然后在视图中,用户将输入数量,视图负责进行计算并自行更新(价格 * 数量)。如果稍后您想保存此修改,您可以使用相同的模型 LineProduct 将更改发布回服务器。 “TotalPrice”只是一个显示字段,它不会存储在数据库中。使用PricePerPiece + Quantity,您始终可以再次计算总价。 【参考方案1】:

也许这就是你需要的

MVC Pattern

MVC 是一种用于解耦用户界面(视图)、数据(模型)和应用程序逻辑(控制器)的设计模式。这种模式有助于实现关注点分离。

你已经有了你的模型,viewmodel 是一个具有你需要的 ui 属性的类。控制器是您进行计算以及模型和视图模型之间的映射。

【讨论】:

【参考方案2】:

您需要在 LineProductProduct 之间建立一对多关系。

    LineProduct 模型-
public class LineProduct

    public Guid LineProductId  get; set;  = Guid.NewGuid();
    public double Quantity  get; set; 

    public string ProductName 
    
        get  return this.Product != null ? this.Product.ProductName : null; 
    
    public double PricePerPiece 
     
        get  return this.Product != null ? this.Product.PricePerPiece : 0;  
            
    public double TotalPrice 
     
        get  return this.Quantity * this.PricePerPiece;  
    

    public Guid ProductId  get; set; 
    public Product Product  get; set; 

    DbContextOnModelCreating 方法中配置关系-
protected override void OnModelCreating(ModelBuilder modelBuilder)

    modelBuilder.Entity<LineProduct>(e =>
    
        e.HasKey(p => p.LineProductId);
        e.HasOne(p => p.Product)
        .WithMany()
        .HasForeignKey(p => p.ProductId);
    );

    在您的DbContext 中为LineProduct 添加DbSet -
public DbSet<LineProduct> LineProducts  get; set; 
    查询LineProduct,使其包含相关的Product -
var list = myDbContext.LineProducts.Include(p=> p.Product).ToList();

【讨论】:

我照你说的做了,但是 LineProduct 表仍然是空的。如果我在 Product 表中添加产品,LineProduct 表中不会发生任何事情,因此在查询其数据时,DataGrid 就像表一样保持为空(出于调试目的,我使用数据库浏览器检查表及其内容)。 @Filiberto 我想我误解了LineProduct 的目的或用法。 LineProduct 对象有自己的数据,比如Quantity,所以创建产品肯定不会为您创建LineProductLineProduct 是一个不同的实体,其数据将存储在不同的表中。 我可能弄错了这个问题。我想要的是另一个 DataGrid,其中包含来自 DbSet Products 的各种产品,还有一个包含数量的列(可由用户编辑)和一个包含总价的列(数量 * PricePerPiece)。问题是我无法添加这两列,因为它们没有链接到任何数据源。此外,这个新 DataGrid 中包含产品名称、价格、数量和总价的每一行都必须保存在数据库的另一个表中,以备将来更改。 LineProduct 只是我解决这个问题的尝试。 @Filiberto 我对 UWP DataGrid 不熟悉,但是您用来显示产品网格的 DataSource 在这里不起作用。您必须使用IdQuantityProductId 列创建一个新表LineProduct,其中ProductId 将是Product 表的外键。然后你必须使用我在答案中提到的查询。它将为您提供LineProduct 实体和相关Product 实体的列表。您已针对此查询创建了 DataSource

以上是关于有没有办法在另一个具有附加属性的模型中使用 DbSet?的主要内容,如果未能解决你的问题,请参考以下文章

使用具有附加属性的自定义层保存和加载 keras 模型

具有未在模型中定义的附加属性的 NSManagedObject 子类

获取具有所有属性的 Laravel 模型

有没有办法将属性文件包含在另一个属性文件中?

使用 LINQ 根据 C# 中的属性值搜索嵌套在另一个列表中的列表中的项目?

在另一个 iframe 中找到一个 iframe?