我正在尝试使用代码优先在EF中映射现有数据库。提供者(jetEntityFrameworkProvider)首先不支持DB。
我正在尝试映射表"组件" (1)到表" ComponentText" (许多)
这就是我所拥有的
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>().Map(m =>
{
m.Properties(p => new { p.ComponentText });
m.ToTable("ComponentText");
});
modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter);
}
当我运行它时,我收到以下错误
System.InvalidOperationException:&#39;属性&#39; ComponentText&#39;在类型&#39;组件&#39;无法映射,因为它已从模型中明确排除,或者它是所使用的DbModelBuilderVersion不支持的类型。&#39;
这些是仅包含相关属性的模型
组件
[Table("Component")]
public class Component
{
[Key]
[Column("Counter")]
public int Id { get; set; }
[Column("Name")]
public virtual ICollection<ComponentText> ComponentText { get; set; }
}
ComponentText
[Table("ComponentText")]
public class ComponentText
{
[Key]
[Column("Counter")]
public int Id { get; set; }
public int TextId { get; set; }
public string Text { get; set; }
//** Foreign Key
public int ComponentCounter { get; set; }
}
ETA:
我已根据Backs回答更改了我的代码。但是,它仍然无法正常工作。我尝试了几种变体。 .HasRequired(),. HasOptional()。
注意我删除了m.ToTable(&#34; ComponentText&#34;);由于Component已经在类中映射到&#34;组件&#34;表
我收到0结果并在结果视图中收到此错误
错误=函数评估需要运行所有线程。
如果我取消注释评论modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter);
我收到此错误
Component_ComponentText_Target :: Multiplicity在Role&#39; Component_ComponentText_Target&#39;中无效。在关系&#39; Component_ComponentText&#39;。由于“从属角色”是指关键属性,因此“从属角色”的多重性的上限必须为“&#39; 1”。
public class ProjectContext : DbContext
{
private DbConnection con = new JetConnection();
public ProjectContext() : base(new JetConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = 'C:\Users\Ben-Laptop\Desktop\Test-Project.sep'; User Id = Admin; Jet OLEDB:Database Password = SEEME;"), true)
{
Database.SetInitializer<ProjectContext>(null);
}
public DbSet<Component> Components { get; set; }
public DbSet<Content> Contents { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>().HasMany(p => p.ComponentText).WithOptional().HasForeignKey(p => p.ComponentCounter);
//modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter);
}
}
答案 0 :(得分:1)
m.Properties(p => new { p.ComponentText });
,因为它只映射了属性ComponentText
为集合添加映射
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>().Map(m =>
{
m.ToTable("ComponentText");
})
.HasMany(p => p.ComponentText)
.WithRequired()
.HasForeignKey(p => p.ComponentCounter);
}