Entity framework 4 首先使用实体框架代码在SQLAzure联合中进行多对多映射

Entity framework 4 首先使用实体框架代码在SQLAzure联合中进行多对多映射,entity-framework-4,azure-sql-database,Entity Framework 4,Azure Sql Database,在EntityFramework4.1及更高版本(首先使用代码)中,如果两个表之间存在多对多映射,那么EF将创建一个包含两列的映射表(两个表中的每个表的主键) e、 g.如果我们有Trip和Activities,并且2之间有多对多关系,那么EF代码首先会自动创建一个TripActivities表,该表有两列,即Trip\u TripId和Activity\u ActivityId 但是,如果我们要在SQL Azure Federation中创建Trips和Activities表,那么TripsA

在EntityFramework4.1及更高版本(首先使用代码)中,如果两个表之间存在多对多映射,那么EF将创建一个包含两列的映射表(两个表中的每个表的主键) e、 g.如果我们有Trip和Activities,并且2之间有多对多关系,那么EF代码首先会自动创建一个TripActivities表,该表有两列,即Trip\u TripId和Activity\u ActivityId

但是,如果我们要在SQL Azure Federation中创建Trips和Activities表,那么TripsActivities表还需要CustomerId列(如果我们在CustomerId列上进行联合)。
因此,问题是我们如何实现这种多对多映射,以便EF除了TripId和ActivityId列之外,还将CustomerId值插入TripsActivities表?

我在这个网站上找到一篇文章,向我展示了如何实现这一点()。 本质上,我们也需要在代码中为映射表创建实体。 下面是一个相同的示例:

namespace ConsoleApplication1.EF
{
[Table("Emp", Schema="Common")]
public class Emp
{
    public Emp()
    {
        //Projects = new HashSet<Project>();
        ProjectEmps = new HashSet<ProjectEmps>();
    }

    public virtual Guid EmpId { get; set; }
    public virtual string EmpName { get; set; }
    //public virtual ICollection<Project> Projects { get; set; }
    public virtual ICollection<ProjectEmps> ProjectEmps { get; set; }

}

[Table("Project", Schema="Common")]
public class Project
{
    public Project()
    {
        //Emps = new HashSet<Emp>();
        ProjectEmps = new HashSet<ProjectEmps>();
    }

    public virtual Guid ProjectId { get; set; }
    public virtual string ProjectName { get; set; }
    //public virtual ICollection<Emp> Emps { get; set; }
    public virtual ICollection<ProjectEmps> ProjectEmps { get; set; }
}

[Table("ProjectEmps", Schema = "Common")]
public class ProjectEmps
{
    public Emp Emp { get; set; }
    public Project Project { get; set; }
    public Guid Emp_EmpId { get; set; }
    public Guid Project_ProjectId { get; set; }
    public Guid CustomerId { get; set; }
}

public class EmpContext : DbContext
{
    public DbSet<Emp> Emps { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<ProjectEmps> ProjectEmps { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new EmpConfiguration());
        modelBuilder.Configurations.Add(new ProjectConfiguration());

        modelBuilder.Entity<ProjectEmps>().HasKey(p => new {p.Project_ProjectId, p.Emp_EmpId})
            .HasRequired(p => p.Emp).WithMany(p => p.ProjectEmps).HasForeignKey(p => p.Emp_EmpId);

        modelBuilder.Entity<ProjectEmps>().HasRequired(p => p.Project).WithMany(p => p.ProjectEmps).HasForeignKey(p => p.Project_ProjectId);
        modelBuilder.Entity<ProjectEmps>().ToTable("ProjectEmps", "Common");
        base.OnModelCreating(modelBuilder);
    }

}

public class EmpConfiguration : EntityTypeConfiguration<Emp>
{
    public EmpConfiguration()
    {
        ToTable("Common.Emp");

        this.HasMany(i => i.ProjectEmps).WithRequired(e => e.Emp);
    }
}

public class ProjectConfiguration : EntityTypeConfiguration<Project>
{
    public ProjectConfiguration()
    {
        ToTable("Project","Common");

        this.HasMany(i => i.ProjectEmps)
            .WithRequired(p => p.Project);
    }
}
class Program
{
    static void Main(string[] args)
    {
      Database.SetInitializer<EmpContext>(new DropCreateDatabaseAlways<EmpContext>());

      var p1 = new Project() { ProjectId = Guid.NewGuid(), ProjectName = "Fun Boat" };
      var p2 = new Project() { ProjectId = Guid.NewGuid(), ProjectName = "Jumbo Jet" };
      var p3 = new Project() { ProjectId = Guid.NewGuid(), ProjectName = "Free Zoo" };

        var e1 = new Emp() { EmpId = Guid.NewGuid(), EmpName = "Wriju" };
        var e2 = new Emp() { EmpId = Guid.NewGuid(), EmpName = "Wrishika" };
        var e3 = new Emp() { EmpId = Guid.NewGuid(), EmpName = "Saswati" };


        var pe1 = new ProjectEmps()
                      {
                          CustomerId = Guid.NewGuid(),
                          Emp = e1,
                          Project = p1,
                          Emp_EmpId = e1.EmpId,
                          Project_ProjectId = p1.ProjectId
                      };

        var pe2 = new ProjectEmps()
        {
            CustomerId = Guid.NewGuid(),
            Emp = e2,
            Project = p2,
            Emp_EmpId = e2.EmpId,
            Project_ProjectId = p2.ProjectId
        };

        var pe3 = new ProjectEmps()
        {
            CustomerId = Guid.NewGuid(),
            Emp = e3,
            Project = p3,
            Emp_EmpId = e3.EmpId,
            Project_ProjectId = p3.ProjectId
        };

        p1.ProjectEmps.Add(pe1);
        p2.ProjectEmps.Add(pe2);
        p3.ProjectEmps.Add(pe3);

        using (var ctx = new EmpContext())
        {
            ctx.Projects.Add(p1);
            ctx.Projects.Add(p2);
            ctx.Projects.Add(p3);
            ctx.SaveChanges();
           }
       }
     }
名称空间控制台应用程序1.EF
{
[表(“Emp”,Schema=“Common”)]
公共级电磁脉冲
{
公共环境管理计划()
{
//Projects=newhashset();
ProjectEmps=newhashset();
}
公共虚拟Guid EmpId{get;set;}
公共虚拟字符串EmpName{get;set;}
//公共虚拟ICollection项目{get;set;}
公共虚拟ICollection项目emps{get;set;}
}
[表(“项目”,Schema=“公共”)]
公共类项目
{
公共工程()
{
//Emps=新的HashSet();
ProjectEmps=newhashset();
}
公共虚拟Guid ProjectId{get;set;}
公共虚拟字符串ProjectName{get;set;}
//公共虚拟ICollection Emps{get;set;}
公共虚拟ICollection项目emps{get;set;}
}
[表(“ProjectEmps”,Schema=“Common”)]
公共类项目EMPS
{
公共Emp Emp{get;set;}
公共项目{get;set;}
公共Guid Emp_EmpId{get;set;}
公共Guid项目_ProjectId{get;set;}
公共Guid CustomerId{get;set;}
}
公共类EmpContext:DbContext
{
公共数据库集Emps{get;set;}
公共数据库集项目{get;set;}
公共DbSet ProjectEmps{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
添加(新的EmpConfiguration());
添加(新项目配置());
modelBuilder.Entity().HasKey(p=>new{p.Project\u ProjectId,p.Emp\u EmpId})
.HasRequired(p=>p.Emp)。有许多(p=>p.projectemp)。HasForeignKey(p=>p.Emp\u EmpId);
modelBuilder.Entity().HasRequired(p=>p.Project).WithMany(p=>p.ProjectEmps).HasForeignKey(p=>p.Project\u projectd);
modelBuilder.Entity().ToTable(“ProjectEmps”、“Common”);
基于模型创建(modelBuilder);
}
}
公共类配置:EntityTypeConfiguration
{
公共配置()
{
ToTable(“Common.Emp”);
this.HasMany(i=>i.projectemp).WithRequired(e=>e.Emp);
}
}
公共类项目配置:EntityTypeConfiguration
{
公共项目配置()
{
ToTable(“项目”、“普通”);
this.HasMany(i=>i.ProjectEmps)
.WithRequired(p=>p.Project);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
SetInitializer(新的DropCreateDatabaseAlways());
var p1=new Project(){projectd=Guid.NewGuid(),ProjectName=“Fun Boat”};
var p2=new Project(){projectd=Guid.NewGuid(),ProjectName=“Jumbo Jet”};
var p3=new Project(){projectd=Guid.NewGuid(),ProjectName=“Free Zoo”};
var e1=new Emp(){EmpId=Guid.NewGuid(),EmpName=“Wriju”};
var e2=newemp(){EmpId=Guid.NewGuid(),EmpName=“Wrishika”};
var e3=new Emp(){EmpId=Guid.NewGuid(),EmpName=“Saswati”};
var pe1=新项目管理计划()
{
CustomerId=Guid.NewGuid(),
Emp=e1,
项目=p1,
Emp_EmpId=e1.EmpId,
Project\u projectd=p1.projectd
};
var pe2=新项目管理计划()
{
CustomerId=Guid.NewGuid(),
Emp=e2,
项目=p2,
Emp_EmpId=e2.EmpId,
Project\u projectd=p2.projectd
};
var pe3=新项目管理计划()
{
CustomerId=Guid.NewGuid(),
Emp=e3,
项目=p3,
Emp_EmpId=e3.EmpId,
Project_projectd=p3.projectd
};
p1.项目管理增加(pe1);
p2.项目管理增加(pe2);
p3.项目管理增加(pe3);
使用(var ctx=new EmpContext())
{
ctx.Projects.Add(p1);
ctx.Projects.Add(p2);
ctx.Projects.Add(p3);
ctx.SaveChanges();
}
}
}

} 我发现最简单的方法不是使用EF而是使用NHibernate,而是创建一个填充联邦id值的触发器