1

我有以下课程:

public class State
{
    public long Id                    { get; set; }
    public string Name                { get; set; }
    public string Abbreviation        { get; set; }

    // Navigation Properties
    public virtual Country Country    { get; set; }
}

public class School
{
    public long Id                    { get; set; }
    public string Name                { get; set; }
    public string Abbreviation        { get; set; }

    // Navigation Properties
    public virtual State State        { get; set; }
}

以及我的 SQL Server 中的以下数据

| School|             |               |
|  Id   | Name        |    State      |
|  1    | UCLA        |      1        |
+-------+-------------+---------------+
| State |             |               |
|  Id   | Name        | Abbreviation  |
|  1    | California  |      CA       |

我正在尝试创建一个 Rest 控制器,该控制器使用 Web API 使用 HTTP POST 动词创建一个学校实例。

public HttpResponseMessage<School> Post( School school )
{
    SchoolService.CreateSchool( school );
    var response = new HttpResponseMessage<School>( school, HttpStatusCode.Created );
    string uri = Url.Route( null, new { id = school.Id } );

    response.Headers.Location = new Uri( Request.RequestUri, uri );
    return response;
}

Web API 从我的 Web 表单中正确绑定了我的 School 类的 Name 和 Abbreviation 属性并调用控制器中的 POST 方法,但它不知道如何处理 State 类。我不太确定如何设置。我想要一个绑定到 State 类的下拉列表,当我提交 School 的创建时,我现有数据中的正确状态将分配给新的学校实例。

4

2 回答 2

1

First of all, your domain model design is a little rough. Your School table should have a FK to State table and you should have that inside your POCO classes as well:

public class School
{
    public long Id                    { get; set; }
    public long StateId               { get; set; }
    public string Name                { get; set; }
    public string Abbreviation        { get; set; }

    // Navigation Properties
    public virtual State State        { get; set; }
}

Then you should have a form field as similar to below:

<select id="StateId" name="StateId">
    <option value="">Select a State</option>
    <option value="310">CA</option>
    <option value="311">NY</option>
</select>
于 2012-04-04T08:37:36.550 回答
0

在我目前的项目中,我使用以下方法实现了类似的效果:

我有一个 Device 类 (POCO) 和一个 DeviceCommand 类 (POCO)。设备可以有许多命令,每个命令将只有一个设备。

我没有打扰 ViewModel 和 POCO 类在层之间使用。

public class Device
{
    [Key]
    public int ID { get; set; }

    public int DeviceID { get; set; }

    public bool IsActive { get; set; }

    // Navigational properties
    public ICollection<DeviceCommand> CommandList { get; set; }
}

public class DeviceCommand
{
    public int Id { get; set; }

    public string CommandText { get; set; }
    public string CommandId { get; set; }

    // Navigational properties
    public int DeviceId { get; set; }
    public Device Device { get; set; }
}

在我的 DbContext 派生类中,我有以下代码:

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {         
        modelBuilder.Entity<DeviceCommand>()
            .HasRequired(d => d.Device)
            .WithMany(l => l.CommandList)
            .HasForeignKey(b => b.DeviceId)
            .WillCascadeOnDelete();
    }

IMO 您必须使用注释或流畅的 API 设置外键关系。

如果 POST 方法中的参数没有属性,则纯粹根据参数的 .NET 类型做出决定。“简单类型”使用模型绑定。复杂类型使用格式化程序。

请参考此链接以更好地了解 Web api 绑定:

http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

希望这可以帮助。

于 2013-06-05T14:03:04.267 回答