在Create上填写Kendo Datasource实体集合

时间:2017-10-21 16:40:12

标签: c# entity-framework kendo-ui entity-framework-6 kendo-datasource

我有一个名为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);

0 个答案:

没有答案