EF4映射一对多

时间:2014-10-27 11:13:57

标签: c# entity-framework-4 mapping

请帮助找到错误。

错误文本:在模型生成期间检测到一个或多个验证错误。因为依赖角色中的所有属性都是非可空的,所以主要角色的多样性必须为1.

//File.cs
public class File
{
   public int Id { get; set; }
   public string Name { get; set; }

   public ICollection<Sp> Sps { get; set; }
}
//Sp.cs
public class Sp
{
   public int Id { get; set; }
   public int FileId { get; set; }
   public File File { get; set; }
}

映射代码

//mapping File
class File :  EntityTypeConfiguration<File>
{
    public File()
    {
        ToTable("File", "dbo");
        HasKey(x => x.Id);

        Property(x => x.Id).HasColumnName("ID");
        Property(x => x.Name).HasColumnName("NAME");
    }
}
//mapping Sp
class Sp :  EntityTypeConfiguration<Sp>
{
   public Sp()
   {
      ToTable("Sp", "dbo");
      HasKey(x => x.Id);

      Property(x => x.Id).HasColumnName("ID");
      Property(x => x.FileId).HasColumnName("FILE_ID");

      //the location of the error
      HasOptional(d => d.File)
        .WithMany(d => d.Sps)
        .HasForeingKey(d => d.FileId)
        .WillCascadeOnDelete(false);
    }
 }

1 个答案:

答案 0 :(得分:2)

你有一个可选的外键映射到一个非可空的属性是矛盾的,你需要采用这种方式。

HasOptional更改为HasRequired,这意味着每个Sp都必须有关联的File

class Sp :  EntityTypeConfiguration<Sp>
{
   public Sp()
   {
      ToTable("Sp", "dbo");
      HasKey(x => x.Id);

      Property(x => x.Id).HasColumnName("ID");
      Property(x => x.FileId).HasColumnName("FILE_ID");

      //the location of the error
      HasRequired(d => d.File)
        .WithMany(d => d.Sps)
        .HasForeingKey(d => d.FileId)
        .WillCascadeOnDelete(false);
    }
 }

如果这不是您想要的,那么请FileID可以为空

public class Sp
{
   public int Id { get; set; }
   public int? FileId { get; set; }
   public File File { get; set; }
}

这将允许您拥有Sp个没有关联File的记录。