簡體   English   中英

EF Core如何建立關系模型

[英]EF Core how to create relational model

我是Asp.Net Core的初學者,我需要執行以下操作:

我有cursounidade的模特,他們有很多對很多的關系。

兩種模型本身都能很好地工作,但是我的問題是我無法建立關系模型。

這個想法是使一個端點接收一個具有一個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();
}

問題在於,EF不會跟蹤傳入的CursoUnidade上的CursoUnidade實例。 結果,當您嘗試添加和保存它時,它試圖再次創建這兩個實體。 但是,由於它們都已經有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();

這將解決您的當務之急,但是就像我之前說的那樣,這也將允許超支,如果您未明確允許這樣做,那將非常危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM