【发布时间】:2014-01-13 13:45:47
【问题描述】:
我有一些在数据库中没有直接映射的属性,所以我使用的约定是让另一个变量映射到数据库,以及一个用于执行的公共变量我所有的实际工作。常见的是[将布尔属性映射到 char 列][1],但我也有一个 StatusID 属性,其 C# 枚举根据派生类型而不同。
我的公共属性具有[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;
}
}
现在我只有一个实现基类的类,Request:
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”。
【问题讨论】:
标签: c#-4.0 inheritance code-first entity-framework-6