防止属性在添加到数据库后发生更改的最佳方法是什么?
我知道当我在应用程序中实际使用 DbContext 时,我可以通过跟踪状态来做到这一点。但这取决于程序员。
我希望将其包含在 DbContext 覆盖或模型配置中。然后它会自动工作并在有人尝试更新属性时拒绝更改。
解决它的一种方法是覆盖 ValidateEntity 并在那里检查它,但我想知道这是否是最好的解决方案
防止属性在添加到数据库后发生更改的最佳方法是什么?
我知道当我在应用程序中实际使用 DbContext 时,我可以通过跟踪状态来做到这一点。但这取决于程序员。
我希望将其包含在 DbContext 覆盖或模型配置中。然后它会自动工作并在有人尝试更新属性时拒绝更改。
解决它的一种方法是覆盖 ValidateEntity 并在那里检查它,但我想知道这是否是最好的解决方案
您可以通过将属性设置器设为私有来将其放入模型中。据我所知,EF 也映射私有属性。或者您可以基于私有属性(映射)创建一个公共属性(在映射中忽略)并将逻辑放在那里。如果模型不在您手中,那么它应该在您提到的上下文中。ValidateEntity 听起来是一个正确的地方,但老实说我没有做这种事情的经验。
编辑:我尝试了以下
public class Entity
{
public int Id { get; set; }
public string Code { get; private set; }
public string MyCode
{
get { return this.Code; }
set
{
if (string.IsNullOrEmpty(this.Code))
{
this.Code = value;
}
}
}
}
在上下文 OnModelCreating
modelBuilder.Entity<Entity>()
.ToTable("dbo.Entity")
.HasKey(s => s.Id);
modelBuilder.Entity<Entity>()
.Property(s => s.Code)
.IsRequired();
modelBuilder.Entity<Entity>()
.Ignore(s => s.MyCode);
它有效。
在您的实体类中使用您自己的支持变量(老派)和一个表示该属性是否已设置一次的标志来实现该属性:
private DateTime _created;
private bool _createdSet = false;
public DateTime Created
{
get
{
return _created;
}
set
{
if (_createdSet)
{
throw new InvalidOperationException("Property 'Created' cannot be changed once set");
}
_createdSet = true;
_created = value;
}
}