C# 在“数据库优先”中使用相关实体时出现问题

C# 在“数据库优先”中使用相关实体时出现问题,c#,entity-framework,ef-database-first,C#,Entity Framework,Ef Database First,我正在学习MVC,为此我正在开发一个智能论坛。我做了一个数据库,但我有一些实体的问题。我必须执行这个命令 "Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=SmartForum;Trusted_Connection=True; Microsoft.EntityFrameworkCore.SqlServer -OutputDir ModelsFromDb" , 代码片段: modelBuilder.Entity<Arg

我正在学习MVC,为此我正在开发一个智能论坛。我做了一个数据库,但我有一些实体的问题。我必须执行这个命令

 "Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=SmartForum;Trusted_Connection=True; Microsoft.EntityFrameworkCore.SqlServer -OutputDir ModelsFromDb" ,
代码片段:

modelBuilder.Entity<ArgomentiPerArea>(entity =>
            {
                entity.HasKey(e => e.ArgomentoId);

                entity.Property(e => e.ArgomentoId).HasColumnName("argomentoId");

                entity.Property(e => e.Archiviato).HasColumnName("archiviato");

                entity.Property(e => e.AreaId).HasColumnName("areaId");

                entity.Property(e => e.ModeratoreId).HasColumnName("moderatoreId");

                entity.Property(e => e.NomeArgomento).HasColumnName("nome_argomento");

                entity.Property(e => e.NumeroRigaPerArea).HasColumnName("numero_riga_per_area");

                entity.Property(e => e.TestoPerArgomento).HasColumnName("testo_per_argomento");

                entity.HasOne(d => d.Area)
                    .WithMany(p => p.ArgomentiPerArea)
                    .HasForeignKey(d => d.AreaId)
                    .HasConstraintName("FK_ArgomentiPerArea_Aree");

                entity.HasOne(d => d.Moderatore)
                    .WithMany(p => p.ArgomentiPerArea)
                    .HasForeignKey(d => d.ModeratoreId)
                    .HasConstraintName("FK_ArgomentiPerArea_Moderatori");
            });
我签入视图,并且版主和区域具有空值。
我不明白,但我首先对数据库和MVC了解得很浅。我希望有一些建议。

这可能是由于您的Argomenti*和版主/版块之间的循环引用。一个区域将一个集合保留回Argomenti*,因此当MVC对根实体Argomenti进行序列化时,它会穿过该区域,然后遍历该区域,一个Argomenti*集合,然后循环。它退出,不尝试序列化循环依赖项

通常,使用EF和视图的最佳方法是不要尝试向视图发送实体。相反,创建一个POCO普通旧C对象视图模型以发送到视图。此视图模型仅包含视图所需的字段,EF查询使用这些字段。选择以填充该视图模型。这避免了整个循环引用问题,并消除了有意的急于加载的需要。包括或延迟加载的性能风险

例如:如果我想要一个Argumenti列表,并且我想显示每个区域和主持人,作为其中的一部分:

[Serializable]
public class ArgumentiViewModel
{
    public string NomeArgomento { get; set; }
    public bool? Archiviato { get; set; }
    public int? NumeroRigaPerArea { get; set; }
    public string TestoPerArgomento { get; set; }
    public string NomeArea { get; set; } // From Area
    public string NomeCognome { get; set; } // From Moderator
}
然后,当我想将其返回到视图时:

var argomentiViewModels = db.ArgomentiPerArea
    .Select(x => new ArgomentiViewModel
    {
        NomeArgomento = x.NomeArgomento,
        Archiviato - x.Archiviato,
        NumeroRigaPerArea = x.NumeroRigaPerArea,
        TestoPerArgomento = x.TestoPerArgomento,
        NomeArea = x.Area.NomeArea, // From Area
        NomeCognome = x.Moderatori.NomeCognome // From Moderator
    }).ToList();

string msg = "m";
return View(argomentiViewModels);

我总结了代码不应将实体返回到视图的几个好理由。

asp.net-mvc与实体框架无关。数据返回到视图
[Serializable]
public class ArgumentiViewModel
{
    public string NomeArgomento { get; set; }
    public bool? Archiviato { get; set; }
    public int? NumeroRigaPerArea { get; set; }
    public string TestoPerArgomento { get; set; }
    public string NomeArea { get; set; } // From Area
    public string NomeCognome { get; set; } // From Moderator
}
var argomentiViewModels = db.ArgomentiPerArea
    .Select(x => new ArgomentiViewModel
    {
        NomeArgomento = x.NomeArgomento,
        Archiviato - x.Archiviato,
        NumeroRigaPerArea = x.NumeroRigaPerArea,
        TestoPerArgomento = x.TestoPerArgomento,
        NomeArea = x.Area.NomeArea, // From Area
        NomeCognome = x.Moderatori.NomeCognome // From Moderator
    }).ToList();

string msg = "m";
return View(argomentiViewModels);