entity-framework - 将引用表数据设为只读 - EF Core
问题描述
我有一个表 ( Commodity
),它与另一个表 () 具有一对一的关系CommodityMaterial
,在我的 GET 端点中,商品返回它自己的列以及引用表的列(和值),它们可以完美运行。但是,在端点的 POST 操作中,用户应该不能 POST 引用表(CommodityMaterial
)的数据,如何实现呢?我曾经使用 DataContract 禁用此功能,但是,因为我需要 GET 运算符的列,所以这不是一个选项。
我已经尝试过,遵循这篇文章:https ://csharp.christiannagel.com/2016/11/07/efcorefields/ ,删除参考表上的 SET 并创建一个支持字段,但这似乎不起作用(错误支持字段是只读的)。
我也尝试将 SET 设置为受保护,但这不起作用。
所以问题是,如何使引用表只读(仅适用于我的 GET 端点而不是我的 POST 端点)。
商品 POCO 类:
[DataContract]
public class Commodity
{
public Commodity()
{
}
public Commodity(CommodityMaterial commodityMaterial)
{
CommodityMaterial = commodityMaterial;
}
[DataMember]
public long CommodityID { get; set; }
[DataMember]
public long CommodityMaterialID { get; set; }
[DataMember]
public decimal? SpecficWeight { get; set; }
[DataMember]
public CommodityMaterial CommodityMaterial { get; }
}
流畅部分:
modelBuilder.Entity<Commodity>(entity =>
{
entity.Property(e => e.CommodityID)
.HasColumnName("CommodityID")
.ValueGeneratedOnAdd();
entity.Property(e => e.CommodityMaterialID)
.HasColumnName("CommodityMaterialID");
entity.Property(e => e.SpecficWeight)
.HasColumnName("SpecficWeight")
.HasColumnType("decimal(18, 2)");
entity.HasOne(a => a.CommodityMaterial)
.WithOne(b => b.Commodity)
.HasForeignKey<Commodity>(b => b.CommodityMaterialID);
});
解决方案
你的动作接受的参数应该代表你的动作做什么/被允许做什么。如果客户端不能更新相关实体,那么您将请求正文绑定到的类不应该有该实体可用。本质上使用视图模型:
public class CommodityRequest
{
// all properties you want editable
// exclude `CommodityMaterial` obviously
}
然后:
public IActionResult Update(CommodityRequest model)
推荐阅读
- python - 反转python布尔列表中的边缘值
- node.js - 在加密节点库中更新是什么意思?
- excel - VBA 库未注册运行时错误“-2147319779 (8002801d)”
- android - 错误程序类型已存在:com.google.android.gms.measurement.AppMeasurementReceiver
- r - 如何在 DTM 中搜索特定术语
- php - 将主题标签转换为网址
- aws-lambda - 当数据来自 IoT Core 规则时,如何在 AWS Lambda 中获取客户端的 IP 地址?
- mstest - MSTest vS StructureMap:某些间接引用的 dll 不会被结构映射扫描,即使它们确实存在于磁盘上
- python - 寻找像素簇和绘制bbox最有效的算法是什么
- javascript - 如何处理调用浏览器还没有的代码的 SJR 响应?