OData 属性 with internal setter -- 就像 UpdateDate

OData property with internal setter -- like UpdateDate

我有一个名为 "Animal" 的 class 模型。
"Animal" class 有几个属性,但让我们关注以下属性:

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

在 "Animal" class 中,我可以通过执行以下操作让 CreateDate 工作:

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

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

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

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

我不知道如何在服务器端设置它。

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

public class Animal
{
     private string _createUser;

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

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

这是我的工作。

在模型中我有以下内容:

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