modelbuilder如何工作

时间:2014-09-01 13:58:57

标签: c# sql asp.net-mvc linq

我对Code-First中创建的实体之间的关系有疑问:

我有模特:

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 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>();
    }

}

当我创建模型时,我遇到以下错误:多级联删除问题。我在模型创建中添加了模型构建器。 首先,我在WithMany()中没有添加任何参数,并且它使数据库like this

中的关系加倍

这在List和ProjectGroup之间创建了许多双重关系(File,相同,见下文)。 当更改为WithMany(d =&gt; d.Lists)时,关系看起来没问题,只在File和ProjectGroup之间进行一次。

modelBuilder是否会将[foreignKey]的效果加倍? 谁能解释一下这是如何工作的?为什么它之前的双重关系,WithMany()

中没有参数

0 个答案:

没有答案