2015-10-10 2 views
1

Я уже около 4 часов пытался выяснить, что я делаю неправильно с этой иерархией TPT, это была большая боль в шее.Entity Framework сбрасывает значения int до 0 на унаследованный объект

У меня есть базовый класс:

public partial class Registry 
{ 
    public int Id_Audit{get;set;} 
    public string CUD{get;set;} //Key Value 
    public bool Canceled{get;set;} 
    public virtual ICollection<Articles> Articles {get;set;} 
    public virtual ICollection<Paid> Paids {get;set;} 
    //Other base properties 
} 

public partial class Sale : Registry 
{ 
    public int idsale{get;set;} 
} 

public partial class Cuote : Registry 
{ 
    public int idCuote{get;set;} 
    public int Consec{get;set;} 
    public int Modification{get;set;} 
    //Other Cuote properties 
} 

Во время выполнения взаимодействует с Registry объектом до тех пор, пока не решен, какой объект будет будет: Sale или Cuote, так что я сделал класс расширения экспорта базового класса производным класс

public partial class Registry 
{ 
    public Sales ToSale() 
    { 
     Sale r = new Sale 
     { 
      Canceled = this.Canceled, 
      CUD = this.CUD, 
      Id_Auditoria = this.Id_Auditoria, 
      //other properties 
     }; 
     return r; 
    } 
} 

Такая же функция была сделана для cuotes.

Поэтому я использую его как этот

Sale s = tempRegistry.ToSale(); 
dbContext.Registrys.Add(s); 
dbContext.SaveChanges(); 

Но каждый раз, SaveChanges() бросает исключение:

Вкладыше о противоречии с ограничением внешнего ключа "FK_Registrys_Audits". Конфликт произошел в базе данных «testDB», таблице «dbo.Audits», в столбце «Id». Заявление было прекращено.

Но объект установлен до SaveChanges(), но после SaveChanges() его нет.

Вот заголовок (Имена немного разные, Id_Auditoria == Id_Audit, Registros_Auditoria == Registry):

Before

уловом

After

Моя схема базы данных это: Schema Как вы можете видеть, больше нет манипуляций для Sale Объект Итак, почему он все время бросает мне это исключение?

+2

может быть идентификатором null. null автоматически преобразуется в ноль в C#, если свойство не определено, чтобы разрешить нулевое значение. –

+0

Откуда берется 'tempRegistry'? Связан ли он с контекстом и имеет ли он связанный объект Auditoria? –

+0

@GertArnold 'tempRegistry' - это экземпляр класса« Registry »в моей основной форме, этот объект привязан к элементам управления, тогда пользователь решает, какой тип реестра будет, конкретные свойства будут установлены, а затем добавлены в контекст –

ответ

2

Привет всем, наконец, работать, я не совсем уверен, что был точный проблема, я вынужден был перестроен рамочный объект модели, переименовывать классы и т.д., и один из самых важных изменений было

  • Удаленные отношения между унаследованными объектами: свойства навигации по умолчанию не были удалены в предыдущей модели, поэтому, по-видимому, EntityFramework пыталась прочитать Sale. Registry вместо базового класса.

Благодарим за помощь.

Смежные вопросы