通过加入 table 在 Entity Framework 中表达一对多关系
Express One-to-Many relationship in Entity Framework via join table
在数据库设计中,通常的做法是在"one"(或子)端用外键表达一对多关系。 Entity framework 很好地处理了这种情况。
但是,我遇到的情况是通过联接 table 表达一对多关系,其中 table 上的两个外键之一具有唯一约束。
如何配置 Entity Framework 以利用此联接 table?
在我当前的状态下,当对 one/child 实体执行简单的读取查询时,Entity Frameworks 抛出一个异常——正如预期的那样——one/child table 缺少基于导航 属性 的常规名称的列。
您正在寻找的是带有连接的可选一对多关联table。这背后的动机是我们总是试图避免关系数据库模式中的可为空的列。未知信息会降低您存储的数据的质量。因此,可选的实体关联,无论是一对一还是一对多,最好在 SQL 数据库中使用连接 table 来表示,以避免可为空的外键列。
综上所述,不幸的是 EF 不 支持这种类型的映射。如果你真的想实现这个,那么你可能想看看其他支持一对多关联的 ORM 框架 table,比如 NHibernate。
如果我有下面的DDL。
员工 (M:N) 到停车场。但是,约束只保留 link table 中的一名员工,因此 1:N.
-- 启动 TSQL
Use OrganizationReverseDB
GO
SET NOCOUNT ON
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[EmployeeParkingAreaLink]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[EmployeeParkingAreaLink]
END
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[ParkingArea]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[ParkingArea]
END
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[Employee]
END
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[Employee]
END
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Department]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[Department]
END
GO
CREATE TABLE [dbo].[Department](
[DepartmentUUID] [uniqueidentifier] NOT NULL,
[TheVersionProperty] [timestamp] NOT NULL,
[DepartmentName] [nvarchar](80) NULL,
[CreateDate] [datetime] NOT NULL,
)
ALTER TABLE dbo.[Department] ADD CONSTRAINT PK_Department PRIMARY KEY NONCLUSTERED ([DepartmentUUID])
GO
ALTER TABLE [dbo].[Department] ADD CONSTRAINT CK_DepartmentName_Unique UNIQUE ([DepartmentName])
GO
CREATE TABLE [dbo].[Employee] (
[EmployeeUUID] [uniqueidentifier] NOT NULL,
[ParentDepartmentUUID] [uniqueidentifier] NOT NULL,
[TheVersionProperty] [timestamp] NOT NULL,
[SSN] [nvarchar](11) NOT NULL,
[LastName] [varchar](64) NOT NULL,
[FirstName] [varchar](64) NOT NULL,
[CreateDate] [datetime] NOT NULL,
[HireDate] [datetime] NOT NULL
)
GO
ALTER TABLE dbo.Employee ADD CONSTRAINT PK_Employee PRIMARY KEY NONCLUSTERED (EmployeeUUID)
GO
ALTER TABLE [dbo].[Employee] ADD CONSTRAINT CK_SSN_Unique UNIQUE (SSN)
GO
ALTER TABLE [dbo].[Employee] ADD CONSTRAINT FK_EmployeeToDepartment FOREIGN KEY (ParentDepartmentUUID) REFERENCES dbo.Department (DepartmentUUID)
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[ParkingArea]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[ParkingArea]
END
GO
CREATE TABLE [dbo].[ParkingArea]
(
ParkingAreaUUID [UNIQUEIDENTIFIER] NOT NULL DEFAULT NEWSEQUENTIALID()
, ParkingAreaName varchar(24) not null
, CreateDate smalldatetime not null
)
GO
ALTER TABLE dbo.ParkingArea ADD CONSTRAINT PK_ParkingArea PRIMARY KEY NONCLUSTERED (ParkingAreaUUID)
GO
ALTER TABLE [dbo].[ParkingArea] ADD CONSTRAINT CK_ParkingAreaName_Unique UNIQUE (ParkingAreaName)
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[EmployeeParkingAreaLink]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[EmployeeParkingAreaLink]
END
GO
CREATE TABLE [dbo].[EmployeeParkingAreaLink] (
/* [LinkSurrogateUUID] [uniqueidentifier] NOT NULL, */
[TheEmployeeUUID] [uniqueidentifier] NOT NULL,
[TheParkingAreaUUID] [uniqueidentifier] NOT NULL
)
GO
/*
ALTER TABLE dbo.EmployeeParkingAreaLink ADD CONSTRAINT PK_EmployeeParkingAreaLink PRIMARY KEY NONCLUSTERED (LinkSurrogateUUID)
*/
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT FK_EmployeeParkingAreaLinkToEmployee FOREIGN KEY (TheEmployeeUUID) REFERENCES dbo.Employee (EmployeeUUID)
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT FK_EmployeeParkingAreaLinkToParkingArea FOREIGN KEY (TheParkingAreaUUID) REFERENCES dbo.ParkingArea (ParkingAreaUUID)
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT CONST_UNIQUE_EmpUUID UNIQUE (TheEmployeeUUID )
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT CONST_UNIQUE_EmpUUID_PAUUID UNIQUE (TheEmployeeUUID , TheParkingAreaUUID)
GO
Insert into dbo.Department ( [DepartmentUUID], [DepartmentName] , CreateDate )
select '10000000-0000-0000-0000-000000000001' , 'DepartmentOne' , CURRENT_TIMESTAMP
union all select '10000000-0000-0000-0000-000000000002' , 'DepartmentTwo' , CURRENT_TIMESTAMP
Insert into dbo.Employee ( EmployeeUUID, SSN , CreateDate, HireDate , LastName, FirstName , ParentDepartmentUUID)
select '20000000-0000-0000-0000-000000000001' , '111-11-1111' , CURRENT_TIMESTAMP , '01/31/2001' , 'Smith' , 'John' , '10000000-0000-0000-0000-000000000001'
union all select '20000000-0000-0000-0000-000000000002' , '222-22-2222' , CURRENT_TIMESTAMP, '02/28/2002' , 'Jones' , 'Mary' , '10000000-0000-0000-0000-000000000002'
Insert into dbo.ParkingArea ( [ParkingAreaUUID], [ParkingAreaName] , CreateDate )
select '30000000-0000-0000-0000-000000000001' , 'ParkingAreaOne' , CURRENT_TIMESTAMP
union all select '30000000-0000-0000-0000-000000000002' , 'ParkingAreaTwo' , CURRENT_TIMESTAMP
INSERT INTO [dbo].[EmployeeParkingAreaLink] ( [TheEmployeeUUID] , [TheParkingAreaUUID] )
Select '20000000-0000-0000-0000-000000000001' , '30000000-0000-0000-0000-000000000001'
union all Select '20000000-0000-0000-0000-000000000002' , '30000000-0000-0000-0000-000000000002'
约束 "CONST_UNIQUE_EmpUUID" 是您所说的设置。
像这样的 EmployeeEntity:
[Serializable]
public partial class EmployeeEFEntity
{
public EmployeeEFEntity()
{
CommonConstructor();
}
private void CommonConstructor()
{
//this.MyParkingAreas = new List<ParkingAreaEFEntity>();
}
//EF Tweaks
public virtual Guid? ParentDepartmentUUID { get; set; }
public virtual Guid? EmployeeUUID { get; set; }
public virtual byte[] TheVersionProperty { get; set; }
public virtual DepartmentEFEntity ParentDepartment { get; set; }
public virtual string SSN { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual DateTime CreateDate { get; set; }
public virtual DateTime HireDate { get; set; }
public virtual ICollection<ParkingAreaEFEntity> MyParkingAreas { get; set; }
public ParkingAreaEFEntity MyOneParkingAreaEFEntity {
get
{
return MyParkingAreas.FirstOrDefault();
}
set
{
/* check for more than one here */
this.AddParkingArea(pa);
}
}
public virtual void AddParkingArea(ParkingAreaEFEntity pa)
{
if (!pa.MyEmployees.Contains(this))
{
pa.MyEmployees.Add(this);
}
if (!this.MyParkingAreas.Contains(pa))
{
this.MyParkingAreas.Add(pa);
}
}
public virtual void RemoveParkingArea(ParkingAreaEFEntity pa)
{
if (pa.MyEmployees.Contains(this))
{
pa.MyEmployees.Remove(this);
}
if (this.MyParkingAreas.Contains(pa))
{
this.MyParkingAreas.Remove(pa);
}
}
public override string ToString()
{
return string.Format("{0}:{1},{2}", this.SSN, this.LastName, this.FirstName);
}
你会这样映射:
public class EmployeeMap : EntityTypeConfiguration<EmployeeEFEntity>
{
public EmployeeMap()
{
// Primary Key
this.HasKey(t => t.EmployeeUUID);
this.Property(t => t.EmployeeUUID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(t => t.TheVersionProperty)
.IsRequired()
.IsFixedLength()
.HasMaxLength(8)
.IsRowVersion();
this.Property(t => t.SSN)
.IsRequired()
.HasMaxLength(11);
this.Property(t => t.LastName)
.IsRequired()
.HasMaxLength(64);
this.Property(t => t.FirstName)
.IsRequired()
.HasMaxLength(64);
// Table & Column Mappings
this.ToTable("Employee");
this.Property(t => t.EmployeeUUID).HasColumnName("EmployeeUUID");
this.Property(t => t.ParentDepartmentUUID).HasColumnName("ParentDepartmentUUID");
this.Property(t => t.TheVersionProperty).HasColumnName("TheVersionProperty");
this.Property(t => t.SSN).HasColumnName("SSN");
this.Property(t => t.LastName).HasColumnName("LastName");
this.Property(t => t.FirstName).HasColumnName("FirstName");
this.Property(t => t.CreateDate).HasColumnName("CreateDate");
this.Property(t => t.HireDate).HasColumnName("HireDate");
// Relationships
this.HasMany(t => t.MyParkingAreas)
.WithMany(t => t.MyEmployees)
.Map(m =>
{
m.ToTable("EmployeeParkingAreaLink");
m.MapLeftKey("TheEmployeeUUID");
m.MapRightKey("TheParkingAreaUUID");
});
this.HasRequired(t => t.ParentDepartment)
.WithMany(t => t.Employees)
.HasForeignKey(d => d.ParentDepartmentUUID);
}
}
这样的停车区:
[Serializable]
public partial class ParkingAreaEFEntity
{
public ParkingAreaEFEntity()
{
CommonConstructor();
}
private void CommonConstructor()
{
//this.MyEmployees = new List<EmployeeEFEntity>();
}
public virtual Guid ParkingAreaUUID { get; set; }
public virtual string ParkingAreaName { get; set; }
public virtual DateTime CreateDate { get; set; }
public virtual ICollection<EmployeeEFEntity> MyEmployees { get; set; }
public virtual void AddEmployee(EmployeeEFEntity emp)
{
if (!emp.MyParkingAreas.Contains(this))
{
emp.MyParkingAreas.Add(this);
}
if (!this.MyEmployees.Contains(emp))
{
this.MyEmployees.Add(emp);
}
}
public virtual void RemoveEmployee(EmployeeEFEntity emp)
{
if (emp.MyParkingAreas.Contains(this))
{
emp.MyParkingAreas.Remove(this);
}
if (this.MyEmployees.Contains(emp))
{
this.MyEmployees.Remove(emp);
}
}
在数据库设计中,通常的做法是在"one"(或子)端用外键表达一对多关系。 Entity framework 很好地处理了这种情况。
但是,我遇到的情况是通过联接 table 表达一对多关系,其中 table 上的两个外键之一具有唯一约束。
如何配置 Entity Framework 以利用此联接 table?
在我当前的状态下,当对 one/child 实体执行简单的读取查询时,Entity Frameworks 抛出一个异常——正如预期的那样——one/child table 缺少基于导航 属性 的常规名称的列。
您正在寻找的是带有连接的可选一对多关联table。这背后的动机是我们总是试图避免关系数据库模式中的可为空的列。未知信息会降低您存储的数据的质量。因此,可选的实体关联,无论是一对一还是一对多,最好在 SQL 数据库中使用连接 table 来表示,以避免可为空的外键列。
综上所述,不幸的是 EF 不 支持这种类型的映射。如果你真的想实现这个,那么你可能想看看其他支持一对多关联的 ORM 框架 table,比如 NHibernate。
如果我有下面的DDL。
员工 (M:N) 到停车场。但是,约束只保留 link table 中的一名员工,因此 1:N.
-- 启动 TSQL
Use OrganizationReverseDB
GO
SET NOCOUNT ON
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[EmployeeParkingAreaLink]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[EmployeeParkingAreaLink]
END
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[ParkingArea]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[ParkingArea]
END
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[Employee]
END
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[Employee]
END
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Department]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[Department]
END
GO
CREATE TABLE [dbo].[Department](
[DepartmentUUID] [uniqueidentifier] NOT NULL,
[TheVersionProperty] [timestamp] NOT NULL,
[DepartmentName] [nvarchar](80) NULL,
[CreateDate] [datetime] NOT NULL,
)
ALTER TABLE dbo.[Department] ADD CONSTRAINT PK_Department PRIMARY KEY NONCLUSTERED ([DepartmentUUID])
GO
ALTER TABLE [dbo].[Department] ADD CONSTRAINT CK_DepartmentName_Unique UNIQUE ([DepartmentName])
GO
CREATE TABLE [dbo].[Employee] (
[EmployeeUUID] [uniqueidentifier] NOT NULL,
[ParentDepartmentUUID] [uniqueidentifier] NOT NULL,
[TheVersionProperty] [timestamp] NOT NULL,
[SSN] [nvarchar](11) NOT NULL,
[LastName] [varchar](64) NOT NULL,
[FirstName] [varchar](64) NOT NULL,
[CreateDate] [datetime] NOT NULL,
[HireDate] [datetime] NOT NULL
)
GO
ALTER TABLE dbo.Employee ADD CONSTRAINT PK_Employee PRIMARY KEY NONCLUSTERED (EmployeeUUID)
GO
ALTER TABLE [dbo].[Employee] ADD CONSTRAINT CK_SSN_Unique UNIQUE (SSN)
GO
ALTER TABLE [dbo].[Employee] ADD CONSTRAINT FK_EmployeeToDepartment FOREIGN KEY (ParentDepartmentUUID) REFERENCES dbo.Department (DepartmentUUID)
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[ParkingArea]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[ParkingArea]
END
GO
CREATE TABLE [dbo].[ParkingArea]
(
ParkingAreaUUID [UNIQUEIDENTIFIER] NOT NULL DEFAULT NEWSEQUENTIALID()
, ParkingAreaName varchar(24) not null
, CreateDate smalldatetime not null
)
GO
ALTER TABLE dbo.ParkingArea ADD CONSTRAINT PK_ParkingArea PRIMARY KEY NONCLUSTERED (ParkingAreaUUID)
GO
ALTER TABLE [dbo].[ParkingArea] ADD CONSTRAINT CK_ParkingAreaName_Unique UNIQUE (ParkingAreaName)
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[EmployeeParkingAreaLink]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN DROP TABLE [dbo].[EmployeeParkingAreaLink]
END
GO
CREATE TABLE [dbo].[EmployeeParkingAreaLink] (
/* [LinkSurrogateUUID] [uniqueidentifier] NOT NULL, */
[TheEmployeeUUID] [uniqueidentifier] NOT NULL,
[TheParkingAreaUUID] [uniqueidentifier] NOT NULL
)
GO
/*
ALTER TABLE dbo.EmployeeParkingAreaLink ADD CONSTRAINT PK_EmployeeParkingAreaLink PRIMARY KEY NONCLUSTERED (LinkSurrogateUUID)
*/
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT FK_EmployeeParkingAreaLinkToEmployee FOREIGN KEY (TheEmployeeUUID) REFERENCES dbo.Employee (EmployeeUUID)
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT FK_EmployeeParkingAreaLinkToParkingArea FOREIGN KEY (TheParkingAreaUUID) REFERENCES dbo.ParkingArea (ParkingAreaUUID)
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT CONST_UNIQUE_EmpUUID UNIQUE (TheEmployeeUUID )
GO
ALTER TABLE [dbo].[EmployeeParkingAreaLink] ADD CONSTRAINT CONST_UNIQUE_EmpUUID_PAUUID UNIQUE (TheEmployeeUUID , TheParkingAreaUUID)
GO
Insert into dbo.Department ( [DepartmentUUID], [DepartmentName] , CreateDate )
select '10000000-0000-0000-0000-000000000001' , 'DepartmentOne' , CURRENT_TIMESTAMP
union all select '10000000-0000-0000-0000-000000000002' , 'DepartmentTwo' , CURRENT_TIMESTAMP
Insert into dbo.Employee ( EmployeeUUID, SSN , CreateDate, HireDate , LastName, FirstName , ParentDepartmentUUID)
select '20000000-0000-0000-0000-000000000001' , '111-11-1111' , CURRENT_TIMESTAMP , '01/31/2001' , 'Smith' , 'John' , '10000000-0000-0000-0000-000000000001'
union all select '20000000-0000-0000-0000-000000000002' , '222-22-2222' , CURRENT_TIMESTAMP, '02/28/2002' , 'Jones' , 'Mary' , '10000000-0000-0000-0000-000000000002'
Insert into dbo.ParkingArea ( [ParkingAreaUUID], [ParkingAreaName] , CreateDate )
select '30000000-0000-0000-0000-000000000001' , 'ParkingAreaOne' , CURRENT_TIMESTAMP
union all select '30000000-0000-0000-0000-000000000002' , 'ParkingAreaTwo' , CURRENT_TIMESTAMP
INSERT INTO [dbo].[EmployeeParkingAreaLink] ( [TheEmployeeUUID] , [TheParkingAreaUUID] )
Select '20000000-0000-0000-0000-000000000001' , '30000000-0000-0000-0000-000000000001'
union all Select '20000000-0000-0000-0000-000000000002' , '30000000-0000-0000-0000-000000000002'
约束 "CONST_UNIQUE_EmpUUID" 是您所说的设置。
像这样的 EmployeeEntity:
[Serializable]
public partial class EmployeeEFEntity
{
public EmployeeEFEntity()
{
CommonConstructor();
}
private void CommonConstructor()
{
//this.MyParkingAreas = new List<ParkingAreaEFEntity>();
}
//EF Tweaks
public virtual Guid? ParentDepartmentUUID { get; set; }
public virtual Guid? EmployeeUUID { get; set; }
public virtual byte[] TheVersionProperty { get; set; }
public virtual DepartmentEFEntity ParentDepartment { get; set; }
public virtual string SSN { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual DateTime CreateDate { get; set; }
public virtual DateTime HireDate { get; set; }
public virtual ICollection<ParkingAreaEFEntity> MyParkingAreas { get; set; }
public ParkingAreaEFEntity MyOneParkingAreaEFEntity {
get
{
return MyParkingAreas.FirstOrDefault();
}
set
{
/* check for more than one here */
this.AddParkingArea(pa);
}
}
public virtual void AddParkingArea(ParkingAreaEFEntity pa)
{
if (!pa.MyEmployees.Contains(this))
{
pa.MyEmployees.Add(this);
}
if (!this.MyParkingAreas.Contains(pa))
{
this.MyParkingAreas.Add(pa);
}
}
public virtual void RemoveParkingArea(ParkingAreaEFEntity pa)
{
if (pa.MyEmployees.Contains(this))
{
pa.MyEmployees.Remove(this);
}
if (this.MyParkingAreas.Contains(pa))
{
this.MyParkingAreas.Remove(pa);
}
}
public override string ToString()
{
return string.Format("{0}:{1},{2}", this.SSN, this.LastName, this.FirstName);
}
你会这样映射:
public class EmployeeMap : EntityTypeConfiguration<EmployeeEFEntity>
{
public EmployeeMap()
{
// Primary Key
this.HasKey(t => t.EmployeeUUID);
this.Property(t => t.EmployeeUUID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(t => t.TheVersionProperty)
.IsRequired()
.IsFixedLength()
.HasMaxLength(8)
.IsRowVersion();
this.Property(t => t.SSN)
.IsRequired()
.HasMaxLength(11);
this.Property(t => t.LastName)
.IsRequired()
.HasMaxLength(64);
this.Property(t => t.FirstName)
.IsRequired()
.HasMaxLength(64);
// Table & Column Mappings
this.ToTable("Employee");
this.Property(t => t.EmployeeUUID).HasColumnName("EmployeeUUID");
this.Property(t => t.ParentDepartmentUUID).HasColumnName("ParentDepartmentUUID");
this.Property(t => t.TheVersionProperty).HasColumnName("TheVersionProperty");
this.Property(t => t.SSN).HasColumnName("SSN");
this.Property(t => t.LastName).HasColumnName("LastName");
this.Property(t => t.FirstName).HasColumnName("FirstName");
this.Property(t => t.CreateDate).HasColumnName("CreateDate");
this.Property(t => t.HireDate).HasColumnName("HireDate");
// Relationships
this.HasMany(t => t.MyParkingAreas)
.WithMany(t => t.MyEmployees)
.Map(m =>
{
m.ToTable("EmployeeParkingAreaLink");
m.MapLeftKey("TheEmployeeUUID");
m.MapRightKey("TheParkingAreaUUID");
});
this.HasRequired(t => t.ParentDepartment)
.WithMany(t => t.Employees)
.HasForeignKey(d => d.ParentDepartmentUUID);
}
}
这样的停车区:
[Serializable]
public partial class ParkingAreaEFEntity
{
public ParkingAreaEFEntity()
{
CommonConstructor();
}
private void CommonConstructor()
{
//this.MyEmployees = new List<EmployeeEFEntity>();
}
public virtual Guid ParkingAreaUUID { get; set; }
public virtual string ParkingAreaName { get; set; }
public virtual DateTime CreateDate { get; set; }
public virtual ICollection<EmployeeEFEntity> MyEmployees { get; set; }
public virtual void AddEmployee(EmployeeEFEntity emp)
{
if (!emp.MyParkingAreas.Contains(this))
{
emp.MyParkingAreas.Add(this);
}
if (!this.MyEmployees.Contains(emp))
{
this.MyEmployees.Add(emp);
}
}
public virtual void RemoveEmployee(EmployeeEFEntity emp)
{
if (emp.MyParkingAreas.Contains(this))
{
emp.MyParkingAreas.Remove(this);
}
if (this.MyEmployees.Contains(emp))
{
this.MyEmployees.Remove(emp);
}
}