【发布时间】:2019-10-08 08:53:37
【问题描述】:
我想先用 EF 代码应用现有的数据库表建模。
假设我有三张桌子。
-
Project表。主键是ProjectId,还有ProjectName、StartDate、EndDate等其他列。 -
Technology表。主键是 TechnologyId,其他列是 technologyName、Note 等。 -
ProjectTechnologyLink。将两个表链接在一起。它具有主键 ProjectId 和 TechnologyId,它们也是外键。
ProjectTechnologyLink中的样本数据
ProjectId TechnologyId CreatedBy CreatedDate
25 3 One 2016-01-01
100 4 One 2016-01-01
100 8 Two 2016-01-01
假设一个项目可以有多种技术,而一种技术可以存在于多个项目中。
模型类是: 对于项目:
public class Project
{
public int ProjectId {get;set;}
public string ProjectName {get;set;}
...
public ICollection<ProjectTechnologyLink> ProjectTechnologyLink
}
技术方面:
public class Technology
{
public Technology()
{
ProjectTechnologyLink = new HashSet<ProjectTechnologyLink>();
}
public int TechnologyId {get;set;}
public string TechnologyName {get;set;}
...
public ICollection<ProjectTechnologyLink> ProjectTechnologyLink {get;set;}
}
对于 ProjectTechnologyLink 类。
public class ProjectTechnologyLink
{
public int ProjectId {get;set;}
public int TechnologyId {get;set;}
...
public Project Project {get;set;}
public Technology Technology {get;set;}
}
然后在 OnModelCreating 方法中。
modelBuilder.Entity<ProjectTechLink>(entity =>
{
entity.HasKey(e=> new {e.ProjectId, e.TechnologyId});
entity.ToTable("ProjectTechnology", "myscheme");
entity.HasOne(x=>x.Project)
.WithMany(p=>p.ProjectTechnologyLink)
.HasForeignKey(d=>d.ProjectId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_PROJECT_TECHNOLOGY_LINK_PID");
entity.HasOne(x=>x.Technology)
.WithMany(p=>p.ProjectTechnologyLink)
.HasForeignKey(d=>d.TechnologyId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_PROJECT_TECHNOLOGY_LINK_TID");
});
我的问题是 它适用于所有代码吗?有时我看到人们将一些属性放在类中的属性之前。但我没有。
【问题讨论】:
-
看起来不错,除了您应该将删除级联到链接表,而不是将 ProjectTechLink fk 设置为 null。
-
@DavidBrowne-Microsoft 所以你的意思是我需要删除
OnDelete(DeleteBehavior.ClientSetNull)? -
是的。链接表通常使用
DeleteBehavior.Cascade,除非您有特殊原因说明 ProjectTechnologyLink 应该在删除项目或技术后仍然存在。
标签: c# entity-framework entity-framework-core