我有几个属性,我没有在数据库中的直接映射,所以我使用了具有映射到数据库的另一个变量的约定,以及将用于执行所有操作的公共变量我的实际工作。常见的是[将布尔属性映射到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”。
谢谢!我试图阻止它们在UI层中可见,并完全忘记了这一要求。我喜欢你的'受保护的内部集合';这将允许它们用于查询。 – krillgar