Проблема с внешним ключом в Entity Framework один ко многим - PullRequest
0 голосов
/ 09 января 2020

У меня проблемы с внешним ключом, оказывается, что я делаю ревизию старой системы, в которую добавляется новая таблица, и при этом возникает следующее.

Короче говоря, У меня есть следующие 3 класса.

public class StepUp
{
    [Key]
    [Column(Order = 0)]    
    public string CodigoDelfos { get; set; }    
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Revision { get; set; }
    public virtual ICollection<Accesorio_x_Trafos> Accesorios { get; set; }
    //More irrelevant properties..
}

public class Transformador 
{
    [Key]
    [Column(Order = 0)]
    public string Codigo_delfos { get; set; }
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Revision { get; set; }
    public virtual ICollection<Accesorio_x_Trafos> Accesorio_x_Trafos { get; set; }
    //More irrelevant properties..
}

public class Accesorio_x_Trafos
{
    [Key]
    [Column(Order = 0)]
    public string CodigoAccesorio { get; set; }        
    [Key]
    [Column(Order = 1)]
    public string CodigoDelfos { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Revision { get; set; }       
    public int? Cantidad { get; set; }    
}

Проблема в том, что и StepUp, и Transformador имеют отношение 1- * с Accessorio_x_Trafos.

При переносе база данных создан правильно (добавлены FK)

enter image description here

(игнорируйте FK Accesorios, который является одним из свойств, которые я удалил, чтобы не иметь столько кода)

Проблема в том, что когда я пытаюсь, оба изменяют объект типа Transformer (я делаю это следующим образом)

//Get any object..
var transformador = mContext.Transformador.First();
//Add random data..
transformador.Accesorio_x_Trafos = new List<Accesorio_x_Trafos>
{
    new Accesorio_x_Trafos 
        { CodigoDelfos = transformador.Codigo_delfos, Revision = transformador.Revision, Cantidad = 1, CodigoAccesorio = "05-CBPA0150000802000P0800"},
    new Accesorio_x_Trafos
        { CodigoDelfos = transformador.Codigo_delfos, Revision = transformador.Revision, Cantidad = 2, CodigoAccesorio = "05-CBPA0150000803150P0700"},
    new Accesorio_x_Trafos
        { CodigoDelfos = transformador.Codigo_delfos, Revision = transformador.Revision, Cantidad = 3, CodigoAccesorio = "05-CBPA0150000803150P0700"}
};
//Save it
mContext.SaveChanges();

Но это выдает следующее исключение

Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих отношений. Свойство EntityEntries вернет значение NULL, поскольку один объект не может быть определен как источник исключения. Обработка исключений, в то время как ...

И в InnerException инструкция

INSERT в конфликте с ограничением FOREIGN KEY \ "FK_dbo.Accesorio_x_Trafos_dbo.StepUps_Codigoelf Конфликтное соглашение с базой данных \ "DBTrafos \", табла \ "dbo.StepUps \". \ R \ nСерминал обучения.

Как я могу справиться с этим?

1 Ответ

0 голосов
/ 10 января 2020

Я решаю свою проблему, создав абстрактный класс, который заменил Accessory_x_Trafos таким образом, чтобы вы затем указали каждый унаследованный класс с его внешним ключом и соответствующим свойством навигации.

public abstract class AccesorioTransformador
{
    public Guid Id { get; set; }
    public string CodigoAccesorio { get; set; }
    public int Cantidad { get; set; }   
}

public class AccesorioStepUp : AccesorioTransformador
{
    public string CodigoDelfos { get; set; }
    public int Revision { get; set; }   
    [ForeignKey(nameof(CodigoDelfos)+","+nameof(Revision))]   
    public StepUp.StepUp Transformador { get; set; }
}

public class AccesorioDistribucion : AccesorioTransformador
{
    public string CodigoDelfos { get; set; }
    public int Revision { get; set; }           
    [ForeignKey(nameof(CodigoDelfos) + "," + nameof(Revision))]
    public Transformador Transformador { get; set; }
}

Таким образом в каждом из соответствующих классов я использовал свойства либо типа ICollection<AccesorioStepUp>, либо типа ICollection<AccesorioDistribucion>.

...