2

我有一个名为“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 服务根本不会公开该属性。
如果我尝试使用公共集,则外部调用者可以更改属性。
在“动物”构造函数中,我设置了内部 _CreateUser = System.Threading.Thread.CurrentPrincipal.Identity.Name

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

4

2 回答 2

2

这就是我要工作的地方。

在模型中,我有以下内容:

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
于 2017-04-01T00:18:31.450 回答
0

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

public class Animal
{
     private string _createUser;

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

     internal SetCreateUser(string user)
     {
         _createUser = user;
     }
}
于 2017-03-31T03:11:16.290 回答