C#Entity Framework:可选的一对一关系

时间:2015-09-06 14:57:57

标签: c# entity-framework

我有一个文件表,其中包含互联网上某个文件的URL或者它需要是存储在varbinary(max)列中的物理文件。我创建了第二个表来存储实际的varbinary(max),但我从来没有映射过一对一,当我尝试保存时FileContentId无效时,我错了。

这些是我的模型和地图:

public class FileModel
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string FileContentId { get; set; }

    public string Url { get; set; }
    public string CreatedById { get; set; }
    public DateTime CreatedOn { get; set; }

    public virtual ICollection<FileTable> FileTables { get; set; }
    public virtual User CreatedBy { get; set; }
    public virtual FileContent FileContent { get; set; }
}

public class FileContent
{
    public string Id { get; set; }
    public byte[] Contents { get; set; }

    public virtual FileModel FileModel { get; set; }   
}

public class FileMap : EntityTypeConfiguration<FileModel>
{
    public FileMap()
    {
        ToTable("Files");
        HasKey(t => t.Id);

        Property(t => t.Id);
        Property(t => t.Name);
        Property(t => t.FileContentId);
        Property(t => t.Url);
        Property(t => t.CreatedById);
        Property(t => t.CreatedOn);

        // Relationships
        HasRequired(t => t.CreatedBy)
            .WithMany(t => t.Files)
            .HasForeignKey(t => t.CreatedById);
        HasOptional(t => t.FileContent)
            .WithRequired(t => t.FileModel)
            .Map(t => t.MapKey("FileContentId"));
    }
}

抛出的错误是

  

无效的列名'FileContentId'

我确定它是.Map因为我在值的末尾添加了一个s并且它改变了该错误。

2 个答案:

答案 0 :(得分:1)

其实我即将发布相同的东西:)。在一对一关系中,您不需要指定ForeignKey,因为您的表中的键将在两个表之间使用。因此,如果您将代码更改为此,您将得到相同的结果

 public class FileMap : EntityTypeConfiguration<FileContent>
 {
    public FileMap()
   {
    ToTable("FileContent");
    HasKey(t => t.Id);




    WithRequired(t => t.FileModel)
        .HasOptional(t => t.FileContent)


   }
}  

或者你可以使用DataAnnotations(在这里你应该指定forgienKey。

  public class FileModel
{
 [Key, ForeignKey("FileContent")]
public string Id { get; set; }
public string Name { get; set; }
public string FileContentId { get; set; }

public string Url { get; set; }
public string CreatedById { get; set; }
public DateTime CreatedOn { get; set; }

public virtual ICollection<FileTable> FileTables { get; set; }
public virtual User CreatedBy { get; set; }
public virtual FileContent FileContent { get; set; }
 }

  public class FileContent
 {
   public string Id { get; set; }
   public byte[] Contents { get; set; }
   public virtual FileModel FileModel { get; set; }   
  }

答案 1 :(得分:0)

通过反复试验我解决了这个问题,但我无法解释当我拉动时EF是如何填充FileModel的FileContent的。如果有人能解释我会将其标记为已接受的答案。

解决方案只是从关系中删除.Map。

        public FileMap()
    {
        ToTable("Files");
        HasKey(t => t.Id);

        Property(t => t.Id);
        Property(t => t.Name);
        Property(t => t.FileContentId);
        Property(t => t.Url);
        Property(t => t.CreatedById);
        Property(t => t.CreatedOn);


        // Relationships
        HasRequired(t => t.CreatedBy)
            .WithMany(t => t.Files)
            .HasForeignKey(t => t.CreatedById);
        HasOptional(t => t.FileContent)
            .WithRequired(t => t.FileModel);


    }