有没有办法在另一个具有附加属性的模型中使用 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】:您需要在 LineProduct
和 Product
之间建立一对多关系。
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;
-
在
DbContext
的OnModelCreating
方法中配置关系-
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
,所以创建产品肯定不会为您创建LineProduct
。 LineProduct
是一个不同的实体,其数据将存储在不同的表中。
我可能弄错了这个问题。我想要的是另一个 DataGrid,其中包含来自 DbSetDataSource
在这里不起作用。您必须使用Id
、Quantity
和ProductId
列创建一个新表LineProduct
,其中ProductId
将是Product
表的外键。然后你必须使用我在答案中提到的查询。它将为您提供LineProduct
实体和相关Product
实体的列表。您已针对此查询创建了 DataSource
。以上是关于有没有办法在另一个具有附加属性的模型中使用 DbSet?的主要内容,如果未能解决你的问题,请参考以下文章
具有未在模型中定义的附加属性的 NSManagedObject 子类