Asp.net web api odata v4,列表<&燃气轮机;不可扩展的属性
在odata4中是否可以创建以下模型:Asp.net web api odata v4,列表<&燃气轮机;不可扩展的属性,asp.net-web-api,odata,Asp.net Web Api,Odata,在odata4中是否可以创建以下模型: public class PuppyDogs { public string Name { get; set; } public virtual IList<Bone> Bones { get; set; } } public class Bone { public string ChewType { get; set; } publ
public class PuppyDogs
{
public string Name { get; set; }
public virtual IList<Bone> Bones { get; set; }
}
public class Bone
{
public string ChewType { get; set; }
public int Numberofchews { get; set; }
}
公共类PuppyDogs
{
公共字符串名称{get;set;}
公共虚拟IList骨骼{get;set;}
}
公营骨
{
公共字符串类型{get;set;}
公共整数{get;set;}
}
控制器类看起来像
public class PuppyDogController : ODataController
{
List<PuppysDog> mydogs = new List<PuppysDog>();
private PuppyDogController()
{
if (mydogs.Count == 0)
{
PuppysDog mydog = new PuppysDog();
mydog.Name = "Fido";
mydog.Bones = new List<Bone>()
{
new Bone{ ChewType = "Soft", Numberofchews=1 },
new Bone{ ChewType = "Hard", Numberofchews=2 }
};
mydogs.Add(mydog);
}
}
[EnableQuery]
public IQueryable<PuppysDog> Get()
{
return mydogs.AsQueryable();
}
}
公共类puppeydogcontroller:ODataController
{
List mydogs=新列表();
专用puppeydogcontroller()
{
如果(mydogs.Count==0)
{
PuppysDog mydog=新的PuppysDog();
mydog.Name=“Fido”;
mydog.Bones=新列表()
{
新骨骼{chowtype=“Soft”,Numberofchews=1},
新骨{chowtype=“Hard”,Numberofchews=2}
};
添加(mydog);
}
}
[启用查询]
公共IQueryable Get()
{
返回mydogs.AsQueryable();
}
}
我可以在不使用expand的情况下包含PuppyDogs的Bones属性吗?默认情况下,骨骼不会返回到客户端。您的代码中有几点不清楚,例如,实体集PuppyDogs没有密钥,控制器中的命名约定有点关联等等。使用以下代码,它可以完美地工作,请看一看 PuppyDog.cs
public class PuppyDog
{
[Key]
public string Name { get; set; }
public virtual IList<Bone> Bones { get; set; }
}
pupyydogscocontroller.cs
public class PuppyDogsController : ODataController
{
List<PuppyDog> mydogs = new List<PuppyDog>();
private PuppyDogsController()
{
if (mydogs.Count == 0)
{
PuppyDog mydog = new PuppyDog();
mydog.Name = "Fido";
mydog.Bones = new List<Bone>()
{
new Bone {ChewType = "Soft", Numberofchews = 1},
new Bone {ChewType = "Hard", Numberofchews = 2}
};
mydogs.Add(mydog);
}
}
[EnableQuery]
public IQueryable<PuppyDog> Get()
{
return mydogs.AsQueryable();
}
}
是否需要将骨骼设置为实体集?如果不是,您可以尝试将骨骼制作为复杂类型。骨骼不是复杂类型吗?我认为在模型定义中省略[Key]是一种复杂类型?无论哪种方式,List属性都不会显示在客户端上。您的示例确实有效-控制器上的命名约定是什么?您是否将型号名称复数化?PuppyDog变成了PuppyDogsController?请看@sheamus,如果骨骼是父实体,比如说其他实体,比如BoneType或其他什么,那么骨骼会有一个键吗?我找到了相同的。如果向骨骼添加[Key]属性,那么它实际上会从JSON输出中消失。那么,您如何拥有一个带有键的实体集合呢?
public class PuppyDogsController : ODataController
{
List<PuppyDog> mydogs = new List<PuppyDog>();
private PuppyDogsController()
{
if (mydogs.Count == 0)
{
PuppyDog mydog = new PuppyDog();
mydog.Name = "Fido";
mydog.Bones = new List<Bone>()
{
new Bone {ChewType = "Soft", Numberofchews = 1},
new Bone {ChewType = "Hard", Numberofchews = 2}
};
mydogs.Add(mydog);
}
}
[EnableQuery]
public IQueryable<PuppyDog> Get()
{
return mydogs.AsQueryable();
}
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<PuppyDog>("PuppyDogs");
config.MapODataServiceRoute("odata", null, builder.GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
config.EnsureInitialized();
}
}
{
"@odata.context": "http://localhost:21830/$metadata#PuppyDogs",
"value": [
{
"Name": "Fido",
"Bones": [
{
"ChewType": "Soft",
"Numberofchews": 1
},
{
"ChewType": "Hard",
"Numberofchews": 2
}
]
}
]
}