我有一个文件表,其中包含互联网上某个文件的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并且它改变了该错误。
答案 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);
}