1

防止属性在添加到数据库后发生更改的最佳方法是什么?

我知道当我在应用程序中实际使用 DbContext 时,我可以通过跟踪状态来做到这一点。但这取决于程序员。

我希望将其包含在 DbContext 覆盖或模型配置中。然后它会自动工作并在有人尝试更新属性时拒绝更改。

解决它的一种方法是覆盖 ValidateEntity 并在那里检查它,但我想知道这是否是最好的解决方案

4

2 回答 2

1

您可以通过将属性设置器设为私有来将其放入模型中。据我所知,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);

它有效。

于 2013-10-19T14:08:40.353 回答
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;
        }
    }
于 2013-10-19T14:10:21.603 回答