2014-01-13 59 views
0

我有几个属性,我没有在数据库中的直接映射,所以我使用了具有映射到数据库的另一个变量的约定,以及将用于执行所有操作的公共变量我的实际工作。常见的是[将布尔属性映射到char列] [1],但我也有一个StatusID属性,其C#枚举基于派生类型是不同的。NotMapped属性保持相关属性不被保存?

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

在我的项目,我开始用一种抽象的基本邮件类:

[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说,它不能插入NULL插入列“msgIsSample”由于我已经设置在表创建脚本。这没有任何意义,因为msgIsSample默认为“N”。

回答

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; } 
+0

谢谢!我试图阻止它们在UI层中可见,并完全忘记了这一要求。我喜欢你的'受保护的内部集合';这将允许它们用于查询。 – krillgar