2013-12-17 3 views
1

У меня есть класс компании и сотрудника, оба наследуются от класса Holder. Я использую таблицу для каждого типа с EntityFramework 5, чтобы создать их в базе данныхВнешний ключ с базовым кодом сущности Первый и унаследованный класс

И у меня есть класс CheckinTools, который использует мой класс Holder.

public class Company : Holder 
{  
    public virtual string Email { get; set; } 
    public virtual string Phone { get; set; } 
} 

public class Employee: Holder 
{ 
    public virtual string Phone { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class Holder: IntId 
{ 
    public virtual string Name { get; set; } 
}  

public class CheckinTool: IntId 
{ 
    public virtual Holder EmployeeCompanyHolder { get; set; } 
    public virtual Tool Tool { get; set; } 
    public virtual DateTime CheckinDateTime { get; set; } 
} 

public class IntId 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
} 

Когда я тестирование CRUD в моем MVC приложении все работает хорошо, пока я не создать CheckinTool, после того, как я создал CheckinTool, любая операцию, чтобы получить работник или компанию по Id возвращает следующее сообщение об ошибке: " Свойство «Идентификатор» является частью ключевой информации объекта и не может быть изменено »

Я заметил, что в моей таблице CheckinTool у него есть столбец« IdHolder », у которого есть внешний ключ для идентификатора в таблице Holder, в то время как мой Таблицы Employee and Company имеют внешний ключ к идентификатору, также в держателе

IMO Я решил проблему в плохой путь.

Я только что изменил тип собственности EmployeeCompany в классе CheckinTool от Holder до int Но я чувствую, что что-то не вписывается в это решение.

У кого-нибудь есть идея о том, как его решить без необходимости изменения свойства EmplotyeeCompany?

заранее спасибо

+0

Я не знаю, в чем проблема, потому что я никогда не использовал аннотации для определения сопоставлений между объектами и таблицами. Пожалуйста, рассмотрите использование Fluent API. – mostruash

+0

Он не использует аннотацию для отображения. Аннотации сообщают EF, что это ключ и должны быть сгенерированы автоматически. – Maess

+0

Я свободно владею API API, чтобы применять таблицу к типу с Entity Framework, но какую аннотацию мне нужно использовать? Извините, что я не понял ваш комментарий. Maess –

ответ

0

CheckInTool должны иметь две колонки с ФКС, один toIntId стол (базовый класс) и один держатель стола (убедитесь, что держатель имущества).

Я подозреваю, что ваше сопоставление с таблицами имеет ошибку. Вы создали таблицу для каждого класса, включая IntId и Holder?

+0

Я создал таблицу для Holder, но не для IntId (IntId не отображается на мой контекст, IntId включен как столбец идентификатора в каждой таблице, которую я имею. Когда эти таблицы создаются каркасом Entity, которые они отображаются следующим образом: Employee = PrimaryKey -> Id; -> ForeingKey -> Id в таблице Holder - Компания = PrimaryKey -> Id; -> ForeingKey - -> Id в таблице Holder - CheckinTool = PrimaryKey -> Id; -> ForeingKey -> Id в таблице Holder и Id в таблице инструментов - Holder = PrimaryKey -> Id; No ForeingKey –

+0

@ RafaelMiceli in в этом случае попробуйте сделать IntId интерфейсом вместо базового класса. –

+0

Я попробую, спасибо –

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