C# modelbuilder的工作原理

C# modelbuilder的工作原理,c#,sql,asp.net-mvc,linq,C#,Sql,Asp.net Mvc,Linq,我有一个关于在代码中创建的实体之间的关系的问题: 我有模型: public class ProjectGroup { [Key] public int ProjectGroupID { get; set; } public string ProjectGroupName { get; set; } //FK public virtual ICollection<File> Files { get; set; } public virt

我有一个关于在代码中创建的实体之间的关系的问题:

我有模型:

public class ProjectGroup
{
    [Key]
    public int ProjectGroupID { get; set; }
    public string ProjectGroupName { get; set; }

    //FK
    public virtual ICollection<File> Files { get; set; }
    public virtual ICollection<List> Lists { get; set; }
}


public class File
{
    [Key]
    public int FileID { get; set; }
    public int ProjectGroupID { get; set; }
    [Required]
    [Display(Name="Ścieżka pliku")]
    public string FilePath { get; set; }
    [Required]
    [Display(Name="Data Zapisu")]
    [DataType(DataType.DateTime)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd hh:mm:ss}", ApplyFormatInEditMode = true)]
    public DateTime FileSaveDate { get; set; }//no NULL=>error
    [Display(Name="Suma MD5")]
    [StringLength(32)]
    public string FileMD5Hash { get; set; }
    public string IPHost { get; set; }
    public int FileTemplateID { get; set; }

    [ForeignKey("ProjectGroupID")]
    public virtual ProjectGroup ProjectGroup { get; set; }
    [ForeignKey("FileTemplateID")]
    public virtual FileTemplate FileTemplate { get; set; }

    public virtual ICollection<List> Lists { get; set; }//klucz obcy dla listy

}

public class List
{
    [Key]
    public int ListID { get; set; }
    public int UserID { get; set; }
    public int ProjectGroupID { get; set; }
    public int FileID { get; set; }
    public bool Modified { get; set; }
    public bool Verified { get; set; }
    public bool Alive { get; set; }

    [ForeignKey("UserID")]
    public virtual User User { get; set; }  //referencja,przekazanie nazwy FK
    [ForeignKey("ProjectGroupID")]
    public virtual ProjectGroup ProjectGroup { get; set; }
    [ForeignKey("FileID")]
    public virtual File File { get; set; }
}
公共类项目组
{
[关键]
public int ProjectGroupID{get;set;}
公共字符串ProjectGroupName{get;set;}
//FK
公共虚拟ICollection文件{get;set;}
公共虚拟ICollection列表{get;set;}
}
公共类文件
{
[关键]
public int FileID{get;set;}
public int ProjectGroupID{get;set;}
[必需]
[显示(Name=“Ścieżka pliku”)]
公共字符串文件路径{get;set;}
[必需]
[显示(Name=“Data Zapisu”)]
[数据类型(数据类型.日期时间)]
[DisplayFormat(DataFormatString=“{0:yyyy-MM-dd hh:MM:ss}”,ApplyFormatInEditMode=true)]
public DateTime FileSaveDate{get;set;}//无NULL=>错误
[显示(Name=“Suma MD5”)]
[条次建议修正案(32)]
公共字符串FileMD5Hash{get;set;}
公共字符串IPHost{get;set;}
public int FileTemplateID{get;set;}
[ForeignKey(“ProjectGroupID”)]
公共虚拟项目组项目组{get;set;}
[ForeignKey(“FileTemplateID”)]
公共虚拟文件模板文件模板{get;set;}
公共虚拟ICollection列表{get;set;}//klucz obcy dla listy
}
公共班级名单
{
[关键]
public int ListID{get;set;}
public int UserID{get;set;}
public int ProjectGroupID{get;set;}
public int FileID{get;set;}
公共布尔修改{get;set;}
公共bool已验证{get;set;}
公共布尔活动{get;set;}
[外键(“用户ID”)]
公共虚拟用户用户{get;set;}//referenceja,przekazanie-nazwy-FK
[ForeignKey(“ProjectGroupID”)]
公共虚拟项目组项目组{get;set;}
[外键(“文件ID”)]
公共虚拟文件{get;set;}
}
和背景:

public class AWZDContext : DbContext
{
    public AWZDContext()
    {

    }

    public DbSet<User> Users { get; set; }
    public DbSet<File> Files { get; set; }
    public DbSet<List> Lists { get; set; }
    public DbSet<RemotePC> RemotePCs { get; set; }
    public DbSet<UserType> UserTypes { get; set; }
    public DbSet<ProjectGroup> ProjectGroups { get; set; }
    public DbSet<FileTemplate> FileTemplates { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<File>()                
            .HasRequired(f=>f.ProjectGroup)
            .WithMany(t=>t.Files)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<List>()
            .HasRequired(c => c.ProjectGroup)
            .WithMany(d=>d.Lists)
            .WillCascadeOnDelete(false);

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

}
公共类AWZDContext:DbContext
{
公共上下文()
{
}
公共数据库集用户{get;set;}
公共数据库集文件{get;set;}
公共数据库集列表{get;set;}
公共数据库集RemotePC{get;set;}
公共数据库集用户类型{get;set;}
公共数据库集项目组{get;set;}
公共DbSet文件模板{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.HasRequired(f=>f.ProjectGroup)
.WithMany(t=>t.Files)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasRequired(c=>c.ProjectGroup)
.WithMany(d=>d.List)
.WillCascadeOnDelete(假);
modelBuilder.Conventions.Remove();
}
}
当我创建模型时,我遇到了以下错误:多重级联删除问题。我在创建模型时添加了modelbuilder。 首先,我在
WithMany()
中没有添加任何参数,它使数据库中的关系增加了一倍

这在List和ProjectGroup之间创建了许多双重关系(相同的文件,如下所示)。 当更改为WithMany(d=>d.Lists)时,文件和项目组之间的关系看起来正常,只有一次类似

modelBuilder在模型中是否将[foreignKey]的效果加倍? 有人能解释一下这是怎么回事吗?为什么它在WithMany()中没有参数,而在更早的时候使用了双重关系