我有现有的 poco 模型和我想与 EF 6 一起使用的现有数据库。但是,我的许多模型具有不映射到数据库中的列的属性。当 EF 向 sql 发送一个 select 语句时,它会询问这些属性,就像它们是列一样,但由于这些列不存在,EF 最终会抛出“无效的列名”异常。
EF 6 中是否有约定将所有 poco 属性视为列类型?如果是这样,哪个公约对此负责?如果不是,还有什么其他机制导致此行为,我该如何禁用它?
理想情况下,如果我像这样在 EntityTypeConfiguration 中显式映射它,我希望我的实现只将 poco 属性视为数据库中的一个列:
public class MyPocoMap : EntityTypeConfiguration<Authorization>
{
public MyPocoMap()
{
this.Property(t => t.MyPropName).HasColumnName("MyColumnName");
}
}
并且不必为我不希望 EF 映射的所有属性执行此操作:
this.Ignore(t => t.MyPropName);
这是我如何进行映射的示例。我想找到一种方法来禁用 NotColumn1 和 NotColumn2 属性的映射,而无需显式使用流畅的 API 来忽略这些属性中的每一个。
public class MyContext : DbContext
{
static MyContext()
{
Database.SetInitializer<MyContext>(null);
}
public MyContext()
: base("Name=MyContext")
{
}
public DbSet<MyModel> MyModels { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new MyModelMap());
}
}
public class MyModel
{
public int CustomId { get; set; }
public string MyColumn1 { get; set; }
public string MyColumn2 { get; set; }
public string NotColumn1 { get; set; }
public string NotColumn2 { get; set; }
}
public class MyModelMap : EntityTypeConfiguration<MyModel>
{
public MyModelMap()
{
this.ToTable("MyTable");
this.HasKey(t => t.CustomId);
this.Property(t => t.MyColumn1).HasColumnName("Column1Name");
this.Property(t => t.MyColumn2).HasColumnName("Column2Name");
this.Ignore(t => t.NotColumn1);
this.Ignore(t => t.NotColumn2);
}
}
最佳答案
在 EF6
中,您可以使用以下自定义约定代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties()
.Where(p => p.Name == "SomePropertyName")
.Configure(p => p.Ignore());
}
您可以在此 address 找到更多关于 EF6
的自定义代码对话
关于c# - 什么约定将 poco 属性自动映射到列?我怎样才能禁用该自动映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289755/