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

时间:2015-03-05 23:44:50

标签: entity-framework linq-to-entities

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

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

如果团队类声明了List属性,则TeamMember类可以声明:

  1. 没有

  2. TeamID为int属性

  3. 团队作为对象属性

  4. TeamID和团队属性

  5. 以下声明有何不同?为什么我应该选择一个而不是另一个?

    我知道如果我没有指定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;}
        ...
    }
    

1 个答案:

答案 0 :(得分:1)

前两个实现将产生相同的数据库结构。

enter image description here

注意TeamMembers中FK的结构。实体框架已经看到Team上有一个名为 TeamMembers 的导航属性。 EF没有找到指定的外键,但知道它需要添加一个,所以这样做的格式为Class_PrimaryKey。另请注意,FK可以为空(可选)。 CASCADE DELETE 设置为NO ACTION

第3次和第4次实施导致不同的数据库结构

enter image description here

注意FK现在不可为空,即必需,如果会员没有与之关联的团队,您将遇到约束错误。此外,由于必需的FK(TeamId), CASCADE DELETE 现已启用。 您可以使用实现4,并在添加新的TeamMember时拥有可选的团队。使用FluentApi来描述将添加到DbContext类

中的以下关系
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<Member>()
                    .HasOptional(m => m.Team)
                    .WithMany(t => t.Members)
                    .HasForeignKey(m => m.TeamId)
                    .WillCascadeOnDelete(false);            
}

希望有所帮助。 NB很抱歉因为在这个答案中我已经使用了会员代替TeamMember而感到困惑