如何在WEB API数据库中建立实体关系?

时间:2016-07-13 14:19:56

标签: angularjs database foreign-keys asp.net-web-api2 entity-relationship

我正在使用AngularJS作为前端,使用ASP.NET WEB API 2作为后端的任务管理工具。我在数据库中有两个实体,一个"任务"和"类型"。 每项任务都有一种关联类型。用户在创建新任务时填写表单,并且必须为该任务选择类型。

这是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,对吗?一个用于任务,一个用于类型,因为它们是两个独立的实体。

但由于它们存储了两个不同的ID,我怎么知道某个任务有某种类型?换句话说,如果我向KBTM_Task发送GET请求,我该如何获得该任务的类型?

2 个答案:

答案 0 :(得分:1)

修改KBTM_Task实体以包含类型ID和外键关系

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")以及您的相关对象(" Type")可以访问其属性(名称,描述,...)。

在客户端对象(模型)上更新TypeID时,只需使用$ http.put()将更新的任务对象推送到API即可处理数据库更新。

答案 1 :(得分: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; } 
}

在包管理器控制台中使用[JsonIgnore] atttribute use Install-Package Newtonsoft.Json。(管理序列化的一种流行解决方案)