实体框架未将所有信息保存到数据库中

问题描述 投票:1回答:2

我面临的一个问题是我尝试了一些解决方案来解决,但我没有。基本上,我有一个方法,我从ajax post获得一个字符串和一个序列化Map作为参数。与此相关的所有操作都运行良好,除了以下事实:例如,我拥有相同的FileId和不同的UseCaseId,因为那样只会保存一个信息,而不是两个都保存。

** UseCaseId和FileId **是来自其他表的外键。

关系:

modelBuilder.Entity<Content>()
        .HasIndex(ct => ct.FileId)
        .IsUnique(false);
    modelBuilder.Entity<Content>()
        .HasIndex(ct => ct.UseCaseId)
        .IsUnique(false);

    modelBuilder.Entity<Content>()
        .HasKey(cn => cn.ContentId);
    modelBuilder.Entity<Content>()
        .HasOne(cn => cn.File)
        .WithOne()
        .OnDelete(DeleteBehavior.Cascade);
    modelBuilder.Entity<Content>()
        .HasOne(cn => cn.UseCase)
        .WithOne()
        .OnDelete(DeleteBehavior.Cascade);

在下面的示例中,需要保存两个完全相同的元素,只是具有一个不同的UseCase,但是只有最后一个元素保存在数据库中。

Contents variable

Database - Result

已接收参数:

Parameter Received

这是发生问题的代码:

[HttpPost]
public JsonResult Create([FromBody] ContentJson data)
{
    List<Content> contents = new List<Content>();
    var contentName = string.Empty;
    var array = data.content;
    int order;

    for (int i = 0; i < array.Count; i++)
    {
        var files = JsonConvert.DeserializeObject<string[]>(array[i][1].ToString());

        if (files == null || files.Length == 0)
            continue;

        contentName = array[i][0].ToString();
        order = 1;

        foreach(var fileName in files)
        {
            Content content = new Content();    
            content.Order = order;
            content.UseCaseId = long.Parse(contentName);
            content.FileId = unitOfWork.FileRepository.Get(f => f.FileName.Equals(fileName)).First().FileId;
            contents.Add(content);
            order++;
        }
    }

    unitOfWork.ContentRepository.AddRange(contents);
    unitOfWork.Save();

    return Json(Ok());
}
  • ContentId是自动生成的。
  • 最新版本的EntityFramework和Dotnet
  • 我已经尝试保存每次迭代。
  • 试图实现Equals和HashCode,

    public void Save()
    {
        context.SaveChanges();
    }
    
    private bool disposed = false;
    
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        disposed = true;
    }
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    
    
    
    public Repository<Content> ContentRepository
    {
        get
        {
            if(contentRepository == null)
            {
                contentRepository = new Repository<Content>(context);
            }
            return contentRepository;
        }
    }
    

有人可以帮我吗?我陷入了这个问题。

.net entity-framework asp.net-core .net-core entity-framework-core
2个回答
0
投票

代替contentName使用fileName.contentName即content.UseCaseId = long.Parse(fileName.contentName);同样适用于fileId


0
投票

您的FK配置有冲突。

IsUnique(false)在这里

modelBuilder.Entity<Content>()
    .HasIndex(ct => ct.FileId)
    .IsUnique(false);

modelBuilder.Entity<Content>()
    .HasIndex(ct => ct.UseCaseId)
    .IsUnique(false);

[这意味着FK不是唯一的,但在此之后是WithOne()

modelBuilder.Entity<Content>()
    .HasOne(cn => cn.File)
    .WithOne()
    .OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity<Content>()
    .HasOne(cn => cn.UseCase)
    .WithOne()
    .OnDelete(DeleteBehavior.Cascade);

表示它们是唯一的(关系数据库中一对多和一对一FK关系之间的唯一区别是,后面的FK具有唯一的约束/索引作为后盾)。这优先于非唯一索引映射,并导致了问题。

由于您希望它们不是唯一的,因此必须通过在两个位置WithOne()都替换为[WithMany(),将关系更改为一对多(或多对一,具体取决于您要看的是哪一侧)。 C0]。

一旦执行此操作,就可以删除两个HasIndex配置,因为它们将由EF Core约定自动为您创建。实际上,它们也可以通过您流畅的配置创建,但具有独特性。可能这就是您尝试使用这些HasIndex语句修复的内容,但这只是错误的地方,而应该修复导致它的原因。


推荐问答