实体框架可以设置的只读属性

本文关键字:只读属性 设置 框架 实体 | 更新日期: 2023-09-27 18:16:23

非常基本,但是我的Google-fu让我失望了。

我有一个域对象,比如User,我希望Active属性是只读的。然而,该属性需要在从数据库加载时通过EF(6)进行设置。

表:

CREATE TABLE Users (
    ID INT NOT NULL PRIMARY KEY CLUSTERED,
    Active BIT NOT NULL DEFAULT 1
    -- other stuff
);
类:

public class User
{
    public int ID { get; set; }
    public bool Active { get; set; }    // this should be RO
    public void Activate() {
        Active = true;
        this.AddChangelog(ChangeType.Activation, "Activated");
    }
    public void Deactivate() {
        Active = false;
        this.AddChangelog(ChangeType.Activation, "Deactivated");
    }
    // changelogging, etc.
}

开发人员不应该直接更改Active,而应该使用Activate()Deactivate()方法。然而,EF6需要直接设置Active,以便它可以实例化对象。

架构(如果重要的话):

  • Domain项目中存在用户类
  • EF6类配置通过Data项目完成
  • EF6使用Fluent API配置(保持ORM的东西出我的域项目)
  • EF6不使用dto,直接配置域类

我如何强制(或至少警告)开发人员不要设置user.Active ?至少,我可以向setter提供一些编译时警告(类似于[Obsolete]),以便它们得到通知吗?

谢谢,

实体框架可以设置的只读属性

您可以使用友元程序集来解决您的问题,并将其设置为您想要的项目的公共,并将其设置为其他项目的私有。

[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]