【发布时间】:2018-06-11 15:26:45
【问题描述】:
我有一个表 (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);
});
【问题讨论】:
-
可以将 EF Core 设置为使用导航属性的支持字段(尽管不像链接中的原始属性那样直接)。但是,您不应该将 EF(存储)模型与域/业务逻辑或 DTO/视图模型混合。无论您在课堂上做什么,我都看不出如何阻止客户端获取填充了
CommodityMaterial的对象并简单地将其返回。考虑一下 Chris Prat 的回答中的建议。
标签: entity-framework asp.net-core fluent ef-core-2.0