具有内部setter的OData属性 - 类似于UpdateDate

时间:2017-03-28 21:24:13

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

我有一个名为“动物”的模型 “Animal”类有几个属性,但让我们关注以下属性:

  1. CREATEDATE
  2. CREATEUSER
  3. 在“Animal”类中,我可以通过执行以下操作来使CreateDate工作:

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

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

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

    如果我尝试私人套装,那么OData服务根本不会公开该属性 如果我尝试公共场景,那么外线来电者可以更改属性 在“Animal”构造函数中,我设置了内部_CreateUser = System.Threading.Thread.CurrentPrincipal.Identity.Name

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你可以用一个空的setter来伪装它。它将看到公共集并在OData实体中生成属性。不是最干净的解决方案,但它应该有效。

public class Animal
{
     private string _createUser;

     public string CreateUser
     {
         get { return _createUser; }
         set { }
     }

     internal SetCreateUser(string user)
     {
         _createUser = user;
     }
}