C# 实体框架为联接表创建POCO类

C# 实体框架为联接表创建POCO类,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我试图在我的datacontext中为联接表(为m2m关系创建的那个)创建POCO实体 我这样做的原因是我想自己处理插入表中的键。(不要问我为什么,有几个性能问题。) 所以算法是这样的: 我使用本机ADO.NET工具基于现有的表生成POCO类,比如说TableAnotherTable(这个表连接了另外两个table和AnotherTable)。或者只是手动创建它 我正在尝试为它添加迁移。使用-IgnoreChanges或不使用。如果不使用-IgnoreChanges,它会尝试将现有表TableA

我试图在我的
datacontext
中为联接表(为m2m关系创建的那个)创建POCO实体

我这样做的原因是我想自己处理插入表中的键。(不要问我为什么,有几个性能问题。)

所以算法是这样的:

  • 我使用本机ADO.NET工具基于现有的表生成POCO类,比如说
    TableAnotherTable
    (这个表连接了另外两个
    table
    AnotherTable
    )。或者只是手动创建它

  • 我正在尝试为它添加迁移。使用
    -IgnoreChanges
    或不使用。如果不使用
    -IgnoreChanges
    ,它会尝试将现有表
    TableAnotherTable
    重命名为
    TableAnotherTable1
    。这听起来很公平,但为什么呢?它应该只将现有表映射到新创建的POCO类

  • 我正在清理
    Up()
    Down()
    方法

  • 正在尝试运行应用程序并在上下文中执行一些
    CUD
    操作,但不断出现错误:无效的对象名称
    dbo.TableAnotherTable1

  • 因此,主要问题是:如何将entity framework创建的联接表映射到我自己的类,以便像处理常规实体一样处理它?

    更新

    public class Client
    {
      public int Id {get;set;}
      public ICollection<Group> Groups {get;set;}
    }
    
    public class Group
    {
      public int Id {get;set;}
      public ICollection<Client> Clients {get;set;}
    }
    

    带有自动链接表的初始模型应已生成
    GroupClient
    表,其中包含两列
    Group\u Id
    Client\u Id
    ,构成PK

    您应该能够将其映射到显示了生成的显式
    GroupClient
    实体的模型,该实体已经定义了属性和主键,但您需要更改现有实体导航属性的类型,并指定FK:

    public class Client
    {
        public int Id { get; set; }
        [ForeignKey("Client_Id")]
        public ICollection<GroupClient> Groups { get; set; }
    }
    
    public class Group
    {
        public int Id { get; set; }
        [ForeignKey("Group_Id")]
        public ICollection<GroupClient> Clients { get; set; }
    }
    
    公共类客户端
    {
    公共int Id{get;set;}
    [外国密钥(“客户Id”)]
    公共ICollection组{get;set;}
    }
    公共课组
    {
    公共int Id{get;set;}
    [外国钥匙(“集团Id”)]
    公共ICollection客户端{get;set;}
    }
    
    我个人认为使用Fluent配置更容易遵循:

    型号:

    公共类客户端
    {
    公共int Id{get;set;}
    公共ICollection组{get;set;}
    }
    公共课组
    {
    公共int Id{get;set;}
    公共ICollection客户端{get;set;}
    }
    公共类GroupClient
    {
    公共int组_Id{get;set;}
    public int Client_Id{get;set;}
    }
    
    配置:

    modelBuilder.Entity()
    .ToTable(“集团客户”)
    .HasKey(e=>new{e.Group\u Id,e.Client\u Id});
    modelBuilder.Entity()
    .HasMany(e=>e.Clients)
    .WithRequired()//或(e=>e.Group),以防添加nav属性
    .HasForeignKey(e=>e.Group_Id);
    modelBuilder.Entity()
    .HasMany(e=>e.Groups)
    .WithRequired()//或(e=>e.Client),以防添加nav属性
    .HasForeignKey(e=>e.Client_Id);
    
    您应该能够映射现有表,而不需要迁移。您使用的是Code First还是edmx?@IvanStoev他已经有了一个数据库,我基于现有数据库使用本机ADO.NET工具生成了POCO类table@IvanStoev代码优先btwOk,您能用自动联接表显示初始映射吗?两个实体类和配置(主要需要查看确切的名称,以便使用显式联接表创建完全等效的2
    one-to-many
    )@IvanStoev在主帖子中看到更新。如果我错了,请纠正我,但这会破坏实体之间现有的关系。因此,以前我有
    Group.Clients
    ,现在我将有
    Group.GroupClients
    。我想实现的唯一目标是获取现有联接表的映射并对其进行更改。如果通过break您是指使用关系的现有代码,然后是的。但是没有其他方法。您可以用一种或另一种方式表示它(不能在模型中同时使用它们)。从数据库的角度来看,这两种设置是等效的,但在实体模型中它们看起来不同。使用显式实体,您不再具有自动链接提供的间接性。在这种情况下,非常感谢您提供了完美的答案。只是想让您知道上下文:我正在尝试执行快速更新。我需要为c的50k+实体分配组客户机。我正试图找出一种有效的方法,在组和客户机之间批量插入大量关系。因为常规的方法对我来说很慢。而扩展中的BulkInsert无法支持复杂类型(哎哟,sqlBulkCopy).是的,我期待着这样的事情。你说的扩展是什么意思?不管怎样,理论上你可以有两个不同映射到同一个数据库的派生DBContext,或者使用普通ADO批量插入进行时间关键型操作。是的..正是这一个扩展。这么多人不想编写存储过程、普通SQL等:(
    public class Client
    {
        public int Id { get; set; }
        [ForeignKey("Client_Id")]
        public ICollection<GroupClient> Groups { get; set; }
    }
    
    public class Group
    {
        public int Id { get; set; }
        [ForeignKey("Group_Id")]
        public ICollection<GroupClient> Clients { get; set; }
    }
    
    public class Client
    {
        public int Id { get; set; }
        public ICollection<GroupClient> Groups { get; set; }
    }
    
    public class Group
    {
        public int Id { get; set; }
        public ICollection<GroupClient> Clients { get; set; }
    }
    
    public class GroupClient
    {
        public int Group_Id { get; set; }
        public int Client_Id { get; set; }
    }
    
    modelBuilder.Entity<GroupClient>()
        .ToTable("GroupClient")
        .HasKey(e => new { e.Group_Id, e.Client_Id });
    
    modelBuilder.Entity<Group>()
        .HasMany(e => e.Clients)
        .WithRequired() // or (e => e.Group) in case you add nav property
        .HasForeignKey(e => e.Group_Id);
    
    modelBuilder.Entity<Client>()
        .HasMany(e => e.Groups)
        .WithRequired() // or (e => e.Client) in case you add nav property
        .HasForeignKey(e => e.Client_Id);