首页 > 解决方案 > 将引用表数据设为只读 - 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);

            });

标签: entity-frameworkasp.net-corefluentef-core-2.0

解决方案


你的动作接受的参数应该代表你的动作做什么/被允许做什么。如果客户端不能更新相关实体,那么您将请求正文绑定到的类不应该有该实体可用。本质上使用视图模型:

public class CommodityRequest
{
    // all properties you want editable
    // exclude `CommodityMaterial` obviously
}

然后:

public IActionResult Update(CommodityRequest model)

推荐阅读