【发布时间】:2014-10-09 23:47:44
【问题描述】:
我有现有的 poco 模型和一个我想与 EF 6 一起使用的现有数据库。但是我的许多模型具有不映射到数据库中的列的属性。当 EF 向 sql 发送一条 select 语句时,它会要求提供这些属性,就像它们是列一样,但由于列不存在,EF 最终会抛出“无效的列名”异常。
在 EF 6 中是否有约定让所有 poco 属性都被视为列类型?如果是这样,哪个公约对此负责?如果不是,还有什么其他机制导致了这种行为,我该如何禁用它?
理想情况下,如果我将 poco 属性显式映射到 EntityTypeConfiguration 中,我希望我的实现仅将其视为数据库中的一列:
public class MyPocoMap : EntityTypeConfiguration<Authorization>
{
public MyPocoMap()
{
this.Property(t => t.MyPropName).HasColumnName("MyColumnName");
}
}
并且不必为我不希望 EF 映射的所有属性执行此操作:
this.Ignore(t => t.MyPropName);
这是我如何进行映射的示例。我想找到一种方法来禁用 NotColumn1 和 NotColumn2 属性的映射,而无需显式使用 fluent 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);
}
}
【问题讨论】:
-
您使用代码、模型还是数据库优先?
-
@abatishchev 我首先使用代码,主要是手动映射所有内容...尽管我使用外部的 EF Powertools Beta 4“逆向工程代码优先”工具生成了很多映射代码我的解决方案,然后手动为每个 poco/poco-mapping 引入我需要的东西。
-
@rafe 你解决了吗?
-
想知道您是否对此有任何更新。我知道当您对数据库进行多版本控制并希望精确控制何时映射某些属性时,这是一个巨大的麻烦(因为某些数据库版本可能没有它们或有不同的列)。但是,我还没有找到要删除的特定约定...
标签: c# .net entity-framework ef-code-first entity-framework-6