2015-10-01 2 views
0

У меня есть 1 таблица и 2 представления (PeopleView и ProjectView) в моей БД.Таблица карт и представления с Entity Framework CodeFirst

Таблица с названием Часы, имеет столбцы, которые являются «ссылками» на представления.

[Id] [int] IDENTITY(1,1) NOT NULL, 
[Date] [date] NOT NULL, 
[PeopleId] [int] NOT NULL, // Reference to PeopleView 
[ProjectId] [nvarchar](max) NOT NULL, // Reference to PrijectView 
[Hour] [int] NOT NULL, 

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

Когда я получаю несколько часов объект из БД Я хочу получить доступ к проекту объекта так:

hour.project.name 
hour.project.id 

Это возможно?

час Entity:

public class Hour : Entity<int> 
{ 
    [Column(TypeName = "date")] 
    [Required] 
    public virtual DateTime Date { get; set; } 


    public virtual PeopleView People { get; set; } 
    [Required] 
    public virtual int? PeopleId { get; set; } 


    public virtual ProjectView Project { get; set; } // How to access project object from hour object when Project is a View in DB ? 
    [Required] 
    public virtual string ProjectId { get; set; } 


    [Required] 
    [Column("Hour")] 
    public virtual int Hours { get; set; } 


} 

ProjectView лицо:

[Table("ProjectView")] 
public partial class ProjectView : Entity<string> 
{ 
    [Key] 
    [Column(Order = 0)] 
    [StringLength(50)] 
    public override string Id { get; set; } 

    [StringLength(255)] 
    public string Name { get; set; } 

    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Offer { get; set; } 
} 

ответ

1

Да, вы определенно можете это сделать. Вы можете использовать атрибут/аннотацию ForeignKey, чтобы сообщить инфраструктуре, как строить отношения между вашими классами (даже если в базе данных нет реального внешнего ключа).

Что-то вроде этого:

[ForeignKey("PeopleId")] 
public virtual PeopleView People { get; set; } 
[Required] 
public virtual int? PeopleId { get; set; } 


[ForeignKey("ProjectId")] 
public virtual ProjectView Project { get; set; } 
[Required] 
public virtual string ProjectId { get; set; } 
+0

После этого обязательно создать новую миграцию? Когда я добавил это и попытаюсь получить доступ к свойству, я получил эту ошибку: {«Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения».} –

+1

Нет, вам не нужно создавать миграцию поскольку представления уже существуют в вашей базе данных. Что касается ошибки, возможно ли, что вы удаляете свой DbContext перед доступом к свойству навигации? Это обычная проблема при использовании ленивой загрузки, особенно с MVC - вы можете утилизировать DbContext в своем контроллере, но пытаетесь получить доступ к свойству в своем представлении. – Peter

+0

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