首次创建后保护属性值不变更实体框架代码优先

时间:2013-10-19 13:56:16

标签: c# entity-framework-5

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

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

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

解决问题的一种方法是重写ValidateEntity并在那里检查,但我想知道这是否是最佳解决方案

2 个答案:

答案 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;
        }
    }