在将属性添加到数据库后阻止属性更改的最佳方法是什么?
我知道当我在应用程序中实际使用DbContext时,我可以通过跟踪状态来实现。但那取决于程序员。
我希望将其包含在DbContext覆盖中或模型配置中。然后当有人试图更新属性时,它会自动运行并拒绝更改。
解决问题的一种方法是重写ValidateEntity并在那里检查,但我想知道这是否是最佳解决方案
答案 0 :(得分:1)
您可以通过将属性设置器设为私有来将其放入模型中。据我所知,EF也会映射私人财产。或者您可以基于私有属性(映射)创建公共属性(在map中忽略)并将逻辑放在那里。如果模型不在您的手中,那么它应该在您提到的上下文中。 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);
它有效。
答案 1 :(得分:1)
使用您自己的支持变量(旧学校)在实体类中实现该属性,并使用表示该属性是否已设置一次的标志:
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;
}
}