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实体
我这样做的原因是我想自己处理插入表中的键。(不要问我为什么,有几个性能问题。)
所以算法是这样的:
TableAnotherTable
(这个表连接了另外两个table
和AnotherTable
)。或者只是手动创建它-IgnoreChanges
或不使用。如果不使用-IgnoreChanges
,它会尝试将现有表TableAnotherTable
重命名为TableAnotherTable1
。这听起来很公平,但为什么呢?它应该只将现有表映射到新创建的POCO类Up()
和Down()
方法CUD
操作,但不断出现错误:无效的对象名称dbo.TableAnotherTable1
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,您能用自动联接表显示初始映射吗?两个实体类和配置(主要需要查看确切的名称,以便使用显式联接表创建完全等效的2one-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);