子 属性 声明的差异 - 使用 Id,属性,两者都使用或都不使用

Difference in child property declarations - using Id, property, both or neither

我有一个名为 Team 的 class,它可以有任意数量的可选 TeamMembers。

似乎有 4 种方法可以使用 EF/LINQ to Entities 声明它。

如果团队 class 声明一个列表 属性,TeamMember class 可以声明:

  1. 整数形式的 TeamID 属性

  2. 作为对象的团队属性

  3. 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