Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架代码先对现有表进行多对多设置_Entity Framework_Mapping_Many To Many_Entity Framework 4.1_Code First - Fatal编程技术网

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:在这种情况下,你必须将它映射为一个单独的实体。