2012-02-27 2 views
1

Предположив следующие объекты:EF Codefirst Преобразование базового класса в производный класс

public class Kisi 
{ 
    [Key] 
    public int KisiID { get; set; } 
    public string Ad { get; set; } 
    public string Soyad { get; set; } 

    public virtual ICollection<Grup> Gruplar { get; set; } 
    public virtual ICollection<Kampanya> Kampanyalar { get; set; } 
} 

public class Musteri : Kisi 
{ 
    public int? Yas { get; set; } 
    public string Meslek { get; set; } 

} 

Эти два класса, хранящие одну таблицу (СНУ) в SQL SERVER.

Я сохранил Kisi, и это может быть связано с другими таблицами. Как я могу сделать трансляцию/«продвигать» ее в Musteri, сохраняя тот же ID? Я не могу воссоздать.

Я мог бы выпустить «вручную» SQL INSERT, но это своего рода некрасиво ...

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

+1

Для тех, кто еще, что попадается этот вопрос: http://stackoverflow.com/questions/12843678/converting-a-ef-codefirst-base-class-to-a- inherited-class-using-table-per-type –

ответ

1

Это невозможно без обхода абстракции EF. EF не позволяет вам изменять тип объекта во время выполнения. Столбец дискриминатора не отображается EF.

Что вы можете сделать, это вручную обновить соответствующую строку с помощью инструкции SQL Update.

+0

, если я выполняю запрос sql для поля для поля для обновления вручную. Есть ли какие-либо исключения во время выполнения? –

+0

, кстати, я нашел эту статью http://blogs.msdn.com/b/jeff_adkins/archive/2004/03/15/89825.aspx и i confused –

+0

@ ErayAydoğdu Если сущность, которую вы собираетесь изменить, уже загружен (отсюда и отслеживается) в контексте, который возникнет из-за проблемы, поскольку EF отслеживает только один экземпляр для данного значения первичного ключа. Лучше работать со свежим контекстом после изменения типа объекта. – Eranga

0

Попробуйте это:

var kisi=context.Kisi.Find(Id); 
context.Entry(kisi).State=EntityState.Deleted; 
var musteri= new Musteri() 
{ 
    KisiID=kisi.KisiID, 
    Ad=kisi.Ad, 
    Soyad=kisi.Soyad, 
    Gruplar= kisi.Gruplar, 
    Kampanyalar=kisi.Kampanyalar, 
    Meslek="Adaskdm" 
} 
context.Entry(musteri).State=EntityState.Added; 
context.SaveChanges(); 
Смежные вопросы