Entity framework 实体框架代码先对现有表进行多对多设置
我有以下表格Entity framework 实体框架代码先对现有表进行多对多设置,entity-framework,mapping,many-to-many,entity-framework-4.1,code-first,Entity Framework,Mapping,Many To Many,Entity Framework 4.1,Code First,我有以下表格Essential,EssenseSet,和Essense2EssenceSet Essense2AssenceSet是创建M:M关系的链接表 我一直无法让M:M关系在EF代码中首先工作 这是我的密码: [Table("Essence", Schema = "Com")] public class Essence { public int EssenceID { get; set; } public string Name { get;
Essential
,EssenseSet
,和Essense2EssenceSet
Essense2AssenceSet
是创建M:M关系的链接表
我一直无法让M:M关系在EF代码中首先工作
这是我的密码:
[Table("Essence", Schema = "Com")]
public class Essence
{
public int EssenceID { get; set; }
public string Name { get; set; }
public int EssenceTypeID { get; set; }
public string DescLong { get; set; }
public string DescShort { get; set; }
public virtual ICollection<EssenceSet> EssenceSets { get; set; }
public virtual EssenceType EssenceType { get; set; }
}
[Table("EssenceSet", Schema = "Com")]
public class EssenceSet
{
public int EssenceSetID { get; set; }
public int EssenceMakerID { get; set; }
public string Name { get; set; }
public string DescLong { get; set; }
public string DescShort { get; set; }
public virtual ICollection<Essence> Essences { get; set; }
}
[Table("Essence2EssenceSet", Schema = "Com")]
public class Essence2EssenceSet
{
//(PK / FK)
[Key] [Column(Order = 0)] [ForeignKey("Essence")] public int EssenceID { get; set; }
[Key] [Column(Order = 1)] [ForeignKey("EssenceSet")] public int EssenceSetID { get; set; }
//Navigation
public virtual Essence Essence { get; set; }
public virtual EssenceSet EssenceSet { get; set; }
}
public class EssenceContext : DbContext
{
public DbSet<Essence> Essences { get; set; }
public DbSet<EssenceSet> EssenceSets { get; set; }
public DbSet<Essence2EssenceSet> Essence2EssenceSets { get; set; }
protected override void OnModelCreating(DbModelBuilder mb)
{
mb.Entity<Essence>()
.HasMany(e => e.EssenceSets)
.WithMany(set => set.Essences)
.Map(mc =>
{
mc.ToTable("Essence2EssenceSet");
mc.MapLeftKey("EssenceID");
mc.MapRightKey("EssenceSetID");
});
}
}
[表(“精华”,Schema=“Com”)]
公共阶级本质
{
公共int EssenceID{get;set;}
公共字符串名称{get;set;}
公共int EssenceTypeID{get;set;}
公共字符串DescLong{get;set;}
公共字符串DescShort{get;set;}
公共虚拟ICollection要素集{get;set;}
公共虚拟EssenceType EssenceType{get;set;}
}
[表(“EssenceSet”,Schema=“Com”)]
公共类要素集
{
公共int EssenceSetID{get;set;}
公共int EssenceMakerID{get;set;}
公共字符串名称{get;set;}
公共字符串DescLong{get;set;}
公共字符串DescShort{get;set;}
公共虚拟ICollection Essences{get;set;}
}
[表(“Essence2esenceSet”,Schema=“Com”)]
公共类要素2要素集
{
//(PK/FK)
[Key][Column(Order=0)][ForeignKey(“Essential”)]public int-EssenceID{get;set;}
[Key][Column(Order=1)][ForeignKey(“EssenceSet”)]public int-EssenceSetID{get;set;}
//航行
公共虚拟本质{get;set;}
公共虚拟要素集要素集{get;set;}
}
公共类EssenceContext:DbContext
{
公共数据库集元素{get;set;}
公共数据库集要素集{get;set;}
公共数据库集Essence2AssenceSets{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder mb)
{
mb.实体()
.HasMany(e=>e.EssenceSets)
.WithMany(set=>set.Essences)
.Map(mc=>
{
mc.ToTable(“Essence2资产集”);
MapLeftKey mc(“EssenceID”);
mc.MapRightKey(“EssenceSetID”);
});
}
}
这是我试图运行的代码:
Essence e = new Essence();
e.EssenceTypeID = (int)(double)dr[1];
e.Name = dr[2].ToString();
e.DescLong = dr[3].ToString();
//Get Essence Set
int setID = (int)(double)dr[0];
var set = ctx.EssenceSets.Find(setID);
e.EssenceSets = new HashSet<EssenceSet>();
e.EssenceSets.Add(set);
ctx.Essences.Add(e);
ctx.SaveChanges();
Essential e=新Essential();
e、 EssenceTypeID=(int)(double)dr[1];
e、 Name=dr[2].ToString();
e、 DescLong=dr[3].ToString();
//获取精华集
int setID=(int)(double)dr[0];
var set=ctx.EssenceSets.Find(setID);
e、 EssenceSets=新HashSet();
e、 添加(集合);
ctx.香精添加(e);
ctx.SaveChanges();
下面是错误:
保存未公开其关系的外键属性的实体时出错。EntityEntries属性将返回null,因为无法将单个实体标识为异常源。
我找不到问题所在。我非常感谢你帮我把这件事做好。
谢谢 删除您的
Essence2AssenceSet
model类。若连接表只包含参与多对多关系的相关实体的键,则无需将其映射为实体。还要确保多对多关系的流畅映射为表指定了模式:
mb.Entity<Essence>()
.HasMany(e => e.EssenceSets)
.WithMany(set => set.Essences)
.Map(mc =>
{
mc.ToTable("Essence2EssenceSet", "Com");
mc.MapLeftKey("EssenceID");
mc.MapRightKey("EssenceSetID");
});
mb.Entity()
.HasMany(e=>e.EssenceSets)
.WithMany(set=>set.Essences)
.Map(mc=>
{
mc.ToTable(“Essence2AssenceSet”、“Com”);
MapLeftKey mc(“EssenceID”);
mc.MapRightKey(“EssenceSetID”);
});
您说得对,谢谢!我确实忘记了表模式。在这种情况下,当连接表没有(加载)其他字段时,您是否觉得公开连接表是一种不好的形式?@Ladislav Mrnka,通过显式定义表和使用数据注释,是否无法做到这一点?我发现使用DataAnnotations而不是Fluent Mapping来维护和注释代码要容易得多。@Scott:我不知道如何使用数据批注来实现这一点。数据注释适用于最简单的场景,您可以让EF生成数据库,而不必考虑其结构或命名。如果现有表中有其他字段,该怎么办。我如何映射它们?@Leon:在这种情况下,你必须将它映射为一个单独的实体。