我有一个名为Team的类,可以有任意数量的可选TeamMembers。
似乎有4种方法可以使用EF / LINQ to Entities声明它。
如果团队类声明了List属性,则TeamMember类可以声明:
没有
TeamID为int属性
团队作为对象属性
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;}
...
}
答案 0 :(得分:1)
前两个实现将产生相同的数据库结构。
注意TeamMembers中FK的结构。实体框架已经看到Team上有一个名为 TeamMembers 的导航属性。 EF没有找到指定的外键,但知道它需要添加一个,所以这样做的格式为Class_PrimaryKey。另请注意,FK可以为空(可选)。 CASCADE DELETE 设置为NO ACTION
第3次和第4次实施导致不同的数据库结构
注意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而感到困惑