我是Asp.Net Core的初学者,我需要执行以下操作:
我有模型curso
和unidade
,它们有着多对多的关系。
两个模型都可以很好地工作,但是我的问题是我无法建立关系模型。
这个想法是使一个端点接收一个带有一个unidade
和一个curso
数组的对象,并且API将相应地添加或删除这些关系。
以下代码是我到目前为止所做的,出现错误Identity_Insert
。
我在这个正确的方向上吗?还是有另一种更好的方法呢?
Modelo de curso
public class Curso
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Required]
[Key]
public long curId { get; set; }
[Required]
[StringLength(80)]
public string curDescricao { get; set; }
[Required]
[StringLength(1)]
public string curStatus { get; set; }
[StringLength(20)]
public string curCodExterno { get; set; }
[StringLength(60)]
public string curObservacao { get; set; }
}
Modelo de unidade
public class Unidade
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Required]
[Key]
public long uniId { get; set; }
[Required]
[StringLength(80)]
public string uniDescricao { get; set; }
[Required]
[StringLength(1)]
public string uniStatus { get; set; }
[StringLength(20)]
public string uniCodExterno { get; set; }
public byte[] uniImagem { get; set; }
}
Modelo de CursoUnidade
public class CursoUnidade
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Required]
[Key]
public long cuuId { get; set; }
/*[Required]
public long cuuCurId { get; set; }
[ForeignKey("cuuCurId")]*/
public List<Curso> Curso { get; set; }
/*[Required]
public long cuuUniId { get; set; }
[ForeignKey("cuuUniId")] */
public Unidade Unidade { get; set; }
}
Serviço de unidade
public void AddTeste(CursoUnidade cursoUnidade)
{
_contexto.Add(cursoUnidade);
_contexto.SaveChanges();
}
答案 0 :(得分:0)
问题在于,传入的Curso
上的Unidade
和CursoUnidade
实例没有被EF跟踪。结果,当您尝试添加和保存它时,它试图再次创建这两个实体。但是,由于它们都已经有ID,因此无法这样做并且失败。
这是与尝试直接保存传递给操作的内容相关的众多问题之一。您应该使用视图模型,然后将其映射到最终保存的实际实体上。这迫使您对正在做的事情保持清楚,并减少此类错误。另外,除非您实际上打算使两个相关实例能够在关联时同时进行修改,否则无论如何都没有必要发布整个实体。这很容易导致超量利用,用户对他们不应该做的实体进行修改,并且由于对后期服务器端的处理不严谨,这些对象被盲目地保存到数据库中。
相反,请使用如下视图模型/ DTO:
public class CursoUnidadeDTO
{
public long CursoId { get; set; }
public long UnidadeId { get; set; }
}
然后,按照您的操作:
public void AddTeste(CursoUnidadeDTO cursoUnidade)
{
var curso = await _contexto.Cursos.FindAsync(cursoUnidade.CursoId);
var unidade = await _contexto.Unidades.FindAsync(cursoUnidade.UnidadeId);
if (curso == null || unidade == null)
{
return BadRequest("Cannot create relationship");
}
_contexto.Add(new CursoUnidade { Curso = curso, Unidade = unidade });
await _contexto.SaveChangesAsync();
}
或者,如果您的CursoUnidade
类具有显式的外键属性,则您甚至不需要查找任何内容:
_contexto.Add(new CursoUnidade { CursoId = cursoUnidade.CursoId, UnidadeId = cursoUnidade.UnidadeId });
或者,您可以简单地首先附加这些实体,以便EF知道它们:
_contexto.Attach(cursoUnidade.Curso);
_contexto.Attach(cursoUnidade.Unidade);
_contexto.Add(cursoUnidade);
await _contexto.SaveChangesAsync();
这将解决您的当务之急,但是就像我之前说过的那样,这也将允许过度使用,如果这不是您明确允许的内容,则可能非常危险。