NotMapped属性是否保存相关属性?

时间:2014-01-13 13:45:47

标签: c#-4.0 inheritance code-first entity-framework-6

我有一些属性,我没有在数据库中直接映射,所以我使用了另一个映射到数据库的变量的约定,以及将用于执行的公共变量我所有的实际工作。常见的是[将布尔属性映射到char列] [1],但我也有一个StatusID属性,其C#enum根据派生类型而不同。

我的公共属性上有[NotMapped]属性,我的内部属性具有[Column]属性。我认为有些东西因为公共属性没有被映射,所以它也会阻止其他属性被映射。

在我的项目中,我从一个抽象的基类Message类开始:

[Table("tblMessage")]
public abstract class Message {
    [Column("msgIsSample")]
    [Required]
    internal string dbIsSample { get; set; }

    [Column("msgStatusID")]
    internal int? dbStatusId { get; set; }

    [NotMapped]
    public bool IsSample {
        get {
            return dbIsSample.ToUpper() == "Y";
        }
        set {
            dbIsSample = value ? "Y" : "N";
        }
    }

    public Message() {
        this.IsSample = false;
        this.dbStatusId = null;
    }
}

现在我只有一个实现基类的类,请求:

public class Request : Message {
    [NotMapped]
    public int Status {
        get {
            return this.dbStatusId.HasValue ? this.dbStatusId.Value : 1;
        }
        set {
            this.dbStatusId = value;
        }
    }

    public Request()
        : base() {
            this.Status = 1;
    }
}

这是我的背景:

public class MyContext : DbContext {
    public DbSet<Message> Messages { get; set; }

    static MyContext() {
        Database.SetInitializer<MyContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Message>()
                    .Map<Request>(m => m.Requires("msgTypeID").HasValue(1));
    }
}

这是其他人遇到的事吗?我无法找到任何关于为什么这不起作用的内容,即使这看起来像EF团队添加额外的自定义映射之前的公认惯例。其他人必须遇到这个问题。

当我尝试执行此代码时,我得到一个DbUpdateException,说它无法在列“msgIsSample”中插入NULL,因为我已经在表创建脚本中设置了它。这没有任何意义,因为msgIsSample默认为“N”。

1 个答案:

答案 0 :(得分:1)

不要将其设为internal,而是将其设为protected internal

在运行时,EF将动态子类化您的实体。这些扩展类称为dynamic proxies

EF无法设置您的媒体资源,因为它无权访问。要授予EF对您的媒体资源的访问权限,必须具有publicprotected访问权限。您仍然可以拥有internal属性,但可以通过添加protected修饰符来授予子类访问权限。

[Table("tblMessage")]
public abstract class Message {
    [Column("msgIsSample")]
    [Required]
    public string dbIsSample { get; protected internal set; }

    [Column("msgStatusID")]
    public int? dbStatusId { get; protected internal set; }