我有一些属性,我没有在数据库中直接映射,所以我使用了另一个映射到数据库的变量的约定,以及将用于执行的公共变量我所有的实际工作。常见的是[将布尔属性映射到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”。
答案 0 :(得分:1)
不要将其设为internal
,而是将其设为protected internal
。
在运行时,EF将动态子类化您的实体。这些扩展类称为dynamic proxies。
EF无法设置您的媒体资源,因为它无权访问。要授予EF对您的媒体资源的访问权限,必须具有public
或protected
访问权限。您仍然可以拥有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; }