2017-07-17 84 views
0

我创建使用的Visual Studio 2015年与“EF设计师从数据库”如何创建C#的OData V4实体关系

我有2实体的OData v4的项目,它们是SQL视图我从Microsoft SQL Server 2015年创建的,

我可以用简单的OData URI 本地主机中的数据:交/的OData/BookingInfoes( 'BookingId')或 localhsot:交/的OData/Timemarkers( 'BookingId')

我的问题是一个BookingInfo涉及到许多时间标记项目和 我无法使用命令?$ expand,i tri海关在谷歌很多的方法,但是仍然没有运气,

我想是这样

{BookingID:123,BookingDate:"sss",[TimeMarker:[{id:1,info:"sss"},{id:2,info:"balh bla"},{id:3,info:"foo foof oo"}]]} 

请大家帮忙,这个卡我一个星期,我不知道该如何处理。

entiy BookingInfo

namespace wcod.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class BookingInfo 
    { 
     public BookingInfo() 
     { 
      var TimeMarkerList = new List<TimeMarker>(); 
     } 
     public string BookingID { get; set; } 
     public string BookingDate { get; set; } 
     public string BookName { get; set; } 
     public string ChiBookName { get; set; } 
     public string VideoSource_1500 { get; set; } 
     public string VideoSource_300 { get; set; } 
     public string VideoSource_Archive { get; set; } 
     public string MobileVideoSource { get; set; } 
     public string languages { get; set; } 
     public string SeekTime { get; set; } 
     public Nullable<int> IsVideo { get; set; } 
     public string AvailableLangs { get; set; } 
     public Nullable<int> StatusMarkers { get; set; } 
     public string BookRoomID { get; set; } 
     public Nullable<System.DateTime> StartTime { get; set; } 
     public Nullable<int> nexturl { get; set; } 
     public string StrBookingStartTime { get; set; } 
     public string BookomgStatus { get; set; } 

     public virtual ICollection<TimeMarker> TimeMarkers { get; set; } 
    } 
} 

TimeMarker也从SQL视图生成

namespace wcod.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class TimeMarker 
    { 
     public Nullable<long> nrow { get; set; } 
     public Nullable<System.DateTime> StartTime { get; set; } 
     public Nullable<int> OrderNo { get; set; } 
     public string MeetingID { get; set; } 
     public string AgendaName { get; set; } 
     public string ChiAgendaName { get; set; } 
     public int AgendaCode { get; set; } 
     public string AgendaTime { get; set; } 
     public string SpeakerCode { get; set; } 
     public Nullable<int> MarkerID { get; set; } 
     public string AgendaRunningTime { get; set; } 
     public Nullable<bool> AllLangFail { get; set; } 
     public Nullable<bool> isLive { get; set; } 
     public string PopUpMsg { get; set; } 
     public Nullable<bool> HasVideo { get; set; } 
     public string TimeMarkerId { get; set; } 

     public virtual BookingInfo BookingInfo { get; set; } 
    } 
} 

WebApiConfig

using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 
using System.Web.Http; 
using System.Web.Http.OData.Builder; 
using System.Web.Http.OData.Extensions; 
using System.Web.OData.Extensions; 
using wcod3.Models; 

namespace wcod3 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 
      ODataModelBuilder builder = new ODataConventionModelBuilder(); 
      config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 

      var json = config.Formatters.JsonFormatter; 
      json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
      config.Formatters.Remove(config.Formatters.XmlFormatter); 

      config.Formatters.Remove(config.Formatters.XmlFormatter); 
      config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; 
      config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      // var json = config.Formatters.JsonFormatter;   
      builder.EntitySet<TimeMarker>("TimeMarkers"); 
      builder.EntitySet<MeetingInfo>("BookingInfoes"); 

      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 


      ); 

      config.Routes.MapODataServiceRoute("odata", "odata/v4", builder.GetEdmModel()); 
     } 
    } 
} 

这里是我的BookingsController

继承人是个ËTimeMarkersController

[EnableQuery] 
    public IQueryable<TimeMarker> GetTimeMarkers() 
    { 
     return db.TimeMarkers; 
    } 

    // GET: odata/TimeMarkers(5) 
    [EnableQuery] 
    public List<TimeMarker> GetTimeMarker([FromODataUri] string key) 
    { 
     // return SingleResult.Create(db.TimeMarkers.Where(timeMarker => timeMarker.MeetingID == key)); 
     // return List 
     return db.TimeMarkers.Where(timeMarker => timeMarker.MeetingID == key).ToList() ; 

    } 
    public List<MeetingInfo> GetMeetingInfo([FromODataUri] string key) 
    { 
     return db.MeetingInfoes.Where(mi => mi.MeetingID == key).ToList(); 
    } 

和packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.OData" version="6.0.0" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net452" /> 
    <package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net452" /> 
    <package id="Microsoft.Extensions.DependencyInjection" version="1.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="1.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net452" developmentDependency="true" /> 
    <package id="Microsoft.OData.Core" version="7.0.0" targetFramework="net452" /> 
    <package id="Microsoft.OData.Edm" version="7.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Spatial" version="7.0.0" targetFramework="net452" /> 
    <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net452" /> 
    <package id="System.Spatial" version="5.6.0" targetFramework="net452" /> 
</packages> 






http://localhost:49347/odata/v4/TimeMarkers('id')/?$expand=BookingInfo 
http://localhost:49347/odata/v4/TimeMarkers('id')?$expand=BookingInfo 
http://localhost:49347/odata/v4/MeetingInfoes('id')/?$expand=TimeMarkers 
http://localhost:49347/odata/v4/MeetingInfoes('id')?$expand=TimeMarkers 

所有4网址显示父内容只以上,我真的希望他们表现出一起。 请帮忙。

回答

0

我从来没有使用odata与sql-view,但我认为你需要添加一些信息给你模型:没有明确的关系在BookingInfo和TimeMarker之间。

尝试添加到浏览TimeMaker一个明确提及BookingInfo(前BookingInfoId),并以实体TimeMaker:

public partial class TimeMarker 
{ 
    public Nullable<long> nrow { get; set; } 
    public Nullable<System.DateTime> StartTime { get; set; } 
    public Nullable<int> OrderNo { get; set; } 
    public string MeetingID { get; set; } 
    public string AgendaName { get; set; } 
    public string ChiAgendaName { get; set; } 
    public int AgendaCode { get; set; } 
    public string AgendaTime { get; set; } 
    public string SpeakerCode { get; set; } 
    public Nullable<int> MarkerID { get; set; } 
    public string AgendaRunningTime { get; set; } 
    public Nullable<bool> AllLangFail { get; set; } 
    public Nullable<bool> isLive { get; set; } 
    public string PopUpMsg { get; set; } 
    public Nullable<bool> HasVideo { get; set; } 

    public int BookingInfoId { get; set; } 
    [ForeignKey("BookingInfoId ")] 
    public virtual BookingInfo BookingInfo { get; set; } 
} 

然后设置BookingInfo为TimeMarkers的inverse属性:

public partial class BookingInfo 
{ 
    [Required] 
    public string BookingID { get; set; } 
    public string BookingDate { get; set; } 
    public string MeetName { get; set; } 
    public string ChiMeetName { get; set; } 
    public string VideoSource_1500 { get; set; }   
    public string languages { get; set; }   
    public string AvailableLangs { get; set; } 
    public Nullable<int> StatusMarkers { get; set; } 
    public string MeetRoomID { get; set; } 
    public Nullable<System.DateTime> StartTime { get; set; } 
    public Nullable<int> nexturl { get; set; } 
    public string StrBookingStartTime { get; set; } 
    public string MeetomgStatus { get; set; } 

    [InverseProperty("BookingInfo")] 
    public virtual ICollection<TimeMarker> TimeMarkers { get; set; } 

} 

对不起,我不能尝试,但我希望这可以帮助你。

+0

尝试的http://本地主机:端口/的OData/V4/BookingInfoes(” xxxx'),但只有BookingInfo显示,没有timeMarker dis玩然后我试着跟着这个[http://www.entityframeworktutorial.net/entity-relationships.aspx]仍然没有 – user2285201

+0

你尝试localhost:port/odata/v4/BookingInfoes('xxxx')?$ expand = TimeMarkers?如果您不在查询字符串中添加$ expand,那么您看到只有BookingInfo –

+0

我更新了该类,现在仅显示父级内容。 – user2285201

0

我终于把工作做好,

我生成使用EF设计 使用GUI创建模型的关系的实体。EDMX,然后右键单击 要创建的关系,并选择加入协会 左“到‘的entityName’实体添加外键属性”任何型号

*如果您自动更新模型,所有的注释虚拟类将消失,我不知道为什么,最后我得到的关系做

http://localhost:49347/odata/v4/BookingInfoes('key')?$expand=TimeMarkers 

的package.config供您参考

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.OData" version="6.0.0" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.OData" version="5.3.1" targetFramework="net452" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" /> 
    <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net452" /> 
    <package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net452" /> 
    <package id="Microsoft.Extensions.DependencyInjection" version="1.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="1.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net452" developmentDependency="true" /> 
    <package id="Microsoft.OData.Core" version="7.0.0" targetFramework="net452" /> 
    <package id="Microsoft.OData.Edm" version="7.0.0" targetFramework="net452" /> 
    <package id="Microsoft.Spatial" version="7.0.0" targetFramework="net452" /> 
    <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" /> 
    <package id="System.Spatial" version="5.6.0" targetFramework="net452" /> 
</packages>