我有一个名为FileType
的实体,其中有一个名为FileTypeTranslation
的集合,用于存储该实体的所有本地化属性。在创建过程中,我使用值填充此集合以保存它。
实体/集合在DB上正确复制,但是如果我使用创建的新值设置当前传递的FileType
上下文,则创建过程将返回以下错误:
A circular reference was detected while serializing an object of type 'System.Collections.Generic.HashSet1[[Models.Entities.FileTypeTranslation
不幸的是我需要复制以更改上下文,因为我进一步使用相同的上下文来更新/删除/ etc,并且需要同步集合。
问:如何填充实体集合并将其正确地返回到数据源?
public ActionResult FileType_Create([DataSourceRequest]DataSourceRequest request, FileType fileType)
{
if (ModelState.IsValid)
{
var languages = _languageRepository.GetAll();
var fileTypeTranslations = new List<FileTypeTranslation>();
foreach (var language in languages)
{
fileTypeTranslations.Add(new FileTypeTranslation()
{
LanguageId = language.LanguageId,
TypeName = String.Format("{0}{1}", fileType.TypeName, CultureHelper.GetLanguageSuffix(language.LanguageId))
});
}
var entity = new FileType
{
FileTypeId = fileType.FileTypeId,
AcceptType = fileType.AcceptType,
FileTypeTranslations = fileTypeTranslations
};
//I need to complete my current context for further usages.
fileType.FileTypeTranslations = entity.FileTypeTranslations;
_fileTypeRepository.Add(entity);
_fileTypeRepository.SaveChanges();
fileType.FileTypeId = entity.FileTypeId;
}
return Json(new[] { fileType }.ToDataSourceResult(request, ModelState));
}
类
public partial class FileType
{
[Key]
public long FileTypeId { get; set; }
public string AcceptType { get; set; }
public virtual ICollection<FileTypeTranslation> FileTypeTranslations { get; set; }
public FileType()
{
this.FileTypeTranslations = new HashSet<FileTypeTranslation>();
}
}
public class FileTypeTranslation
{
[Key, Column(Order = 0)]
public long FileTypeId { get; set; }
[Key, Column(Order = 1)]
public long LanguageId { get; set; }
[Required]
public string TypeName { get; set; }
public virtual FileType FileType { get; set; }
}
的DbContext
modelBuilder.Entity<FileTypeTranslation>()
.HasRequired<FileType>(c => c.FileType)
.WithMany(c => c.FileTypeTranslations)
.HasForeignKey(p => p.FileTypeId)
.WillCascadeOnDelete(true);