0

Я делаю инструмент управления задачами, используя AngularJS для интерфейса и ASP.NET WEB API 2 для бэкэнд. У меня есть два объекта в базе данных, «Задача» и «Тип». Каждая задача имеет один тип связанных. Пользователь заполняет форму, когда он может создать новую задачу, и он должен выбрать тип для этой задачи.Как создать отношения сущностей в базе данных WEB API?

Вот C# код:

// KBTM_Task.cs file 
public class KBTM_Task 
{ 
    public int ID { get; set; } 
    public string TaskID { get; set; } // User defined ID 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

// KBTM_Type.cs file 
public class KBTM_Type 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

Так что мой вопрос: как я могу «соединить» два в базе данных? Я имею в виду, скажем, я хочу получать данные POST в базу данных. Я должен сделать два POST, верно? Один для задачи и один для типа, поскольку они представляют собой два отдельных объекта.

Но поскольку они хранятся с двумя разными идентификаторами, откуда я знаю, что определенная задача имеет определенный тип? Другими словами, если я отправлю запрос GET на KBTM_Task, как мне получить тип этой задачи?

ответ

1

Измените KBTM_Task объект включить Идентификатор типа и внешнего ключа

public class KBTM_Task 
{ 
    public int ID { get; set; } 
    public string TaskID { get; set; } // User defined ID 
    public string Title { get; set; } 
    public string Description { get; set; } 

    public int TypeID { get; set; } 
    [ForeignKey("TypeID")] 
    public virtual KBTM_Type Type { get; set; } 
} 

Таким образом, когда вы получаете данные из API вашего объекта задача будет уже включать в себя ключ («TypeID»), которые могут быть обновленный и связанный с ним объект («Тип»), с которым вы можете получить доступ к его свойствам (Имя, Описание, ...).

При обновлении TypeID на объекте (модели) клиента вы можете просто нажать обновленный объект задачи на API с помощью $ http.put() для обработки обновления базы данных.

+0

Привет. Извините за задержку в ответе. С этими изменениями я получаю «POST http: // localhost: 59862/api/KBTM_Task 500 (Internal Server Error)» при попытке POST для объекта KBTM_Task. Вы знаете причину? –

+0

Вы просматривали данные json, отправляемые для проверки того, что они действительны? Проверьте заголовок запроса для сообщения. – jbrown

1

1) Добавить внешний ключ текучего API (или аннотацию данных)

// KBTM_Task.cs file 
public class KBTM_Task 
{ 
    public int ID { get; set; } 
    public string TaskID { get; set; } // User defined ID 
    public string Title { get; set; } 
    public string Description { get; set; } 

    public int KBTM_TypeID {get;set} 
    public virtual KBTM_Type {get; set} 
} 

// KBTM_Type.cs file 
public class KBTM_Type 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public KBTM_Task KBTM_Task { get; set;} 
} 

Добавьте следующее в классе, наследуемом от DbContext

public class KbtmContext : DbContext 
{ 
    ... 
    //public virtual DbSet<KBTM_Task> KbtmTasks {get; set;}  
    ... 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // Configure KBTM_TypeID as FK for KBTM_Task 
     modelBuilder.Entity<KBTM_Task>() 
       .HasRequired(k => k.KBTM_Type) 
       .WithRequiredPrincipal(ad => ad.KBTM_Task); 

    } 
} 

2) Если обнажая класс сущностей в ответ API или запросить, тогда вам нужно исключить возможность навигации.

// KBTM_Task.cs file 
public class KBTM_Task 
{ 
    ... 
    [JsonIgnore] 
    public virtual KBTM_Type Type { get; set; } 
} 

Чтобы использовать использование Install-Package Newtonsoft.Json[JsonIgnore] atttribute в менеджере пакетов консоли. (Один из популярных решений для управления сериализации)

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