子 属性 声明的差异 - 使用 Id,属性,两者都使用或都不使用
Difference in child property declarations - using Id, property, both or neither
我有一个名为 Team 的 class,它可以有任意数量的可选 TeamMembers。
似乎有 4 种方法可以使用 EF/LINQ to Entities 声明它。
如果团队 class 声明一个列表 属性,TeamMember class 可以声明:
无
整数形式的 TeamID 属性
作为对象的团队属性
TeamID 和 Team 属性
以下声明有何不同?为什么我会/应该选择一个而不是另一个?
我知道如果我不指定团队/ID 属性,那么我将无法从 TeamMember 对象访问它。但除此之外,它如何影响数据库关系?
Class Team
{
List<TeamMember> TeamMembers {get;set;}
....
}
// implementation 1
Class TeamMember
{
string Name {get;set;}
...
}
// implementation 2
Class TeamMember
{
Team Team {get;set;}
string Name {get;set;}
...
}
// implementation 3
Class TeamMember
{
int TeamID {get;set;}
string Name {get;set;}
...
}
// implementation 4
Class TeamMember
{
Team Team {get;set;}
int TeamID {get;set;}
string Name {get;set;}
...
}
前 2 个实现将产生相同的数据库结构。
注意 TeamMembers 中 FK 的结构。 Entity Framework 已经看到在名为 TeamMembers 的团队中有一个导航 属性。 EF 没有找到指定的外键,但知道它需要添加一个,因此以 Class_PrimaryKey 格式添加。另请注意 FK 可以为空(可选)。 级联删除 设置为无操作
第三个和第四个实现导致不同的数据库结构
注意 FK 现在不可为空,即 必需,如果成员没有与之关联的团队,您将收到约束错误。此外,由于需要 FK (TeamId),CASCADE DELETE 现在已启用。
您可以使用实现 4 并在添加新的 TeamMember 时拥有一个可选的 Team。使用 FluentApi 来描述如下关系,它将被添加到您的 DbContext class
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Member>()
.HasOptional(m => m.Team)
.WithMany(t => t.Members)
.HasForeignKey(m => m.TeamId)
.WillCascadeOnDelete(false);
}
希望对您有所帮助。注意:抱歉,我刚刚意识到我在整个回答过程中使用的是 Member 而不是 TeamMember
我有一个名为 Team 的 class,它可以有任意数量的可选 TeamMembers。
似乎有 4 种方法可以使用 EF/LINQ to Entities 声明它。
如果团队 class 声明一个列表 属性,TeamMember class 可以声明:
无
整数形式的 TeamID 属性
作为对象的团队属性
TeamID 和 Team 属性
以下声明有何不同?为什么我会/应该选择一个而不是另一个?
我知道如果我不指定团队/ID 属性,那么我将无法从 TeamMember 对象访问它。但除此之外,它如何影响数据库关系?
Class Team
{
List<TeamMember> TeamMembers {get;set;}
....
}
// implementation 1
Class TeamMember
{
string Name {get;set;}
...
}
// implementation 2
Class TeamMember
{
Team Team {get;set;}
string Name {get;set;}
...
}
// implementation 3
Class TeamMember
{
int TeamID {get;set;}
string Name {get;set;}
...
}
// implementation 4
Class TeamMember
{
Team Team {get;set;}
int TeamID {get;set;}
string Name {get;set;}
...
}
前 2 个实现将产生相同的数据库结构。
注意 TeamMembers 中 FK 的结构。 Entity Framework 已经看到在名为 TeamMembers 的团队中有一个导航 属性。 EF 没有找到指定的外键,但知道它需要添加一个,因此以 Class_PrimaryKey 格式添加。另请注意 FK 可以为空(可选)。 级联删除 设置为无操作
第三个和第四个实现导致不同的数据库结构
注意 FK 现在不可为空,即 必需,如果成员没有与之关联的团队,您将收到约束错误。此外,由于需要 FK (TeamId),CASCADE DELETE 现在已启用。 您可以使用实现 4 并在添加新的 TeamMember 时拥有一个可选的 Team。使用 FluentApi 来描述如下关系,它将被添加到您的 DbContext class
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Member>()
.HasOptional(m => m.Team)
.WithMany(t => t.Members)
.HasForeignKey(m => m.TeamId)
.WillCascadeOnDelete(false);
}
希望对您有所帮助。注意:抱歉,我刚刚意识到我在整个回答过程中使用的是 Member 而不是 TeamMember