【问题标题】:OData property with internal setter -- like UpdateDate具有内部设置器的 OData 属性——例如 UpdateDate
【发布时间】:2017-03-28 21:24:13
【问题描述】:

我有一个模型,其中包含一个名为“Animal”的类。
“Animal”类有几个属性,但让我们关注以下属性:

  1. 创建日期
  2. 创建用户

在“动物”类中,我可以通过执行以下操作使 CreateDate 工作:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreateDate { get; set; }

这让我可以通过将数据库中的默认值设置为“GetDate()”来在数据库中生成 CreateDate。
当外部调用者尝试在 OData 服务上“设置” CreateDate 字段时,它会忽略正在传递的数据。
这使它成为外部调用者的“只读”属性。

除了需要在 OData 服务器上设置 CreateUser = System.Threading.Thread.CurrentPrincipal.Identity.Name 之外,我需要执行类似于 CreateUser 的操作。

如果我尝试使用私有集,则 OData 服务根本不会公开该属性。
如果我尝试使用公共集,则外部调用者可以更改属性。
在“Animal”构造函数中,我设置了内部 _CreateUser = System.Threading.Thread.CurrentPrincipal.Identity.Name

我不确定如何在服务器端进行设置。

【问题讨论】:

    标签: asp.net-web-api2 odata odata-v4


    【解决方案1】:

    这就是我要工作的地方。

    在模型中我有以下内容:

    public string CreateUser { get; set; }
    
    [NotMapped]
    public string CreateUserName
    {
        get
        {
            return CreateUser;
        }
        set
        {
            CreateUser = CreateUser ?? System.Threading.Thread.CurrentPrincipal.Identity.Name;
        }
    }
    

    然后在 WebApiConfig 我有以下内容:

    builder.EntitySet<Animal>("Animals"));
    builder.EntityType<Animal>().Ignore(p => p.CreateUser); // hide CreateUser
    builder.StructuralTypes.First(t => t.ClrType == typeof(Animal))
        .AddProperty(typeof(Animal).GetProperty(nameof(Animal.CreateUserName))); // show CreateUserName
    

    【讨论】:

    【解决方案2】:

    你可以用一个空的二传手来伪造它。它将查看公共集并在 OData 实体中生成属性。不是最干净的解决方案,但它应该可以工作。

    public class Animal
    {
         private string _createUser;
    
         public string CreateUser
         {
             get { return _createUser; }
             set { }
         }
    
         internal SetCreateUser(string user)
         {
             _createUser = user;
         }
    }
    

    【讨论】:

    • 不幸的是,这确实有效,因为当数据库“CreateUser”为空或第一次创建模型时,我需要在服务器上设置 _createUser。
    • 同样,不是最好的,但您可以使用内部设置器方法并将 InternalsVisible 授予需要设置它的程序集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多