0

在escalado上引發異常。它拋出或沒有包括。實體框架:使用組合鍵作爲PK/FK的實體拋出異常

static void Main(string[] args) 
{ 
    try 
    {     
     using (var context = new CKContext()) 
     {      
      var servReprosWithIncludes = context.ServicioRepro 
               .Include(p => p.Categoria)               
               .ToList(); 
      var escalado = context.EscaladoPrecio 
            //.Include(p => p.Servicio) 
            .ToList(); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

InvalidOperationException異常:是一個對象的密鑰不匹配存儲在所述的ObjectContext相應的屬性值的一部分的屬性的值。如果作爲密鑰一部分的屬性返回不一致或不正確的值,或者在對作爲密鑰一部分的屬性進行更改後未調用DetectChanges,則會發生這種情況。

EscaladoPrecio的映射:

public class EscaladoPrecioMapping : EntityTypeConfiguration<EscaladoPrecio> 
{ 
    public EscaladoPrecioMapping() 
    { 
     base.HasKey(p => new { p.Desde, p.Hasta, p.ServicioReproId });    
     base.HasRequired(p => p.Servicio) 
      .WithMany() 
      .HasForeignKey(p => p.ServicioReproId); 
     base.ToTable("PreciosServicioReprografia"); 
    } 
} 

實體ServicioRepro是從TPT層次結構的一部分。看起來像:

public class ServicioRepro : Producto 
{   
    public bool IncluirPrecioClick { get; set; } 

    public bool IncluirPrecioPapel { get; set; } 

    public bool HayPapel { get; set; } 

    public bool HayImpresion { get; set; } 

    public bool PrecioPorVolumen { get; set; } 

    //public virtual ICollection<EscaladoPrecio> EscaladoPrecio { get; set; } 

    public virtual CategoriaServicioRepro Categoria { get; set; }   

    public virtual ServicioReproFacturacionType ServicioReproFacturacionType { get; set; }  
} 

在此實體上,您看不到密鑰,因爲基本實體Producto擁有它。

實體EscaladoPrecio有3個PK:desde,hasta和Servicio。 Servicio是PK和FK。 實體看起來像(方法,覆蓋和成員已被刪除,以減少代碼):

public class EscaladoPrecio : IComparable<EscaladoPrecio>, IComparable<int>, IComparable, IEntity 
{ 
    #region Declarations 

    private int _desde; 
    private int _hasta; 
    private double _precio; 
    private int _cada; 

    #endregion Declarations 

    #region Constructor 

    public EscaladoPrecio() 
     : this(1, 1, 0, 0) 
    { } 

    public EscaladoPrecio(int desde, int hasta, double precio) 
     : this(desde, hasta, precio, 0) 
    { } 

    public EscaladoPrecio(int desde, int hasta, double precio, int cada) 
    { 
     _desde = desde; 
     _hasta = hasta; 
     _precio = precio; 
     _cada = cada; 
    } 

    #endregion Constructor 

    #region Properties 

    public int Desde 
    { 
     get 
     { 
      return _desde; 
     } 
     set 
     { 
      _desde = value; 
     } 
    } 

    public int Hasta 
    { 
     get 
     { 
      return _hasta; 
     } 
     set 
     { 
      _hasta = value; 
     } 
    } 

    public double Precio 
    { 
     get 
     { 
      return _precio; 
     } 
     set 
     { 
      _precio = value; 
     } 
    } 

    public int Cada 
    { 
     get 
     { 
      return _cada; 
     } 
     set 
     { 
      _cada = value; 
     } 
    } 

    #endregion Properties   

    private int _ServicioReproId; 
    public int ServicioReproId 
    { 
     get 
     { 
      if (Servicio != null) 
      { 
       _ServicioReproId = Servicio.Id; 
       return Servicio.Id; 
      } 
      else 
       return 0; 
     } 
     set 
     { 
      _ServicioReproId = value; 
     } 

    } 

    public virtual ServicioRepro Servicio { get; set; } 
} 

爲什麼拋出異常?

回答

0

的構造你爲什麼這樣做:

public int ServicioReproId 
{ 
    get 
    { 
     if (Servicio != null) 
     { 
      _ServicioReproId = Servicio.Id; 
      return Servicio.Id; 
     } 
     else 
      return 0; 
    } 
    set 
    { 
     _ServicioReproId = value; 
    } 
} 

你的關鍵屬性ServicioReproId這裏返回0潛在儘管它的一部分已加載(並存儲在上下文中),值爲!= 0(可能)。我覺得異常的這部分指的這個問題:「可能發生這種情況如果是關鍵部分返還不一致或不正確的值的屬性。」

最好不要它自動屬性:

public int ServicioReproId { get; set; } 
+0

解決了包括VeGo答案在內的問題。謝謝。 – user2575650

0

嘗試initialice他的虛擬財產類EscaladoPrecio()

+0

謝謝Vego,你的回答幫助我解決了錯誤。 – user2575650

相關問題