簡體   English   中英

EntitySetController的多個導航屬性

[英]EntitySetController multiple navigation properties

我有一個具有多個導航屬性的類的控制器:

public partial class Fixture
{
    public int FixtureId { get; set; }

    //foreign key
    public int StageId { get; set; }
    //navigation properties
    public virtual Stage Stage { get; set; }

    //foreign key
    public int CityId { get; set; }
    //navigation properties
    public virtual City City { get; set; }

    public DateTime FixtureDate { get; set; }

    //foreign key
    public int AwayTeamId { get; set; }
    //navigation properties
    public virtual Team AwayTeam { get; set; }

    //foreign key
    public int HomeTeamId { get; set; }
    //navigation properties
    public virtual Team HomeTeam { get; set; }

    public byte? AwayTeamScore { get; set; }
    public byte? HomeTeamScore { get; set; }
}

我現在正在編寫我的第一個EntitySetController並且我想包括3個導航屬性。 我知道如何包含這樣的內容:

public IQueryable<Fixture> GetFixtures()
{
    return db.Fixtures.Include("Stage");
}

是否可以包含多個這些導航屬性?

另外,在我的帖子中,我如何使用它們來獲取相關對象? 在以前的ApiController版本中,我編寫了存儲庫方法來獲取它們(請參見下文)。 什么是EntitySetController等效項?

public override HttpResponseMessage Post(Fixture fixture)
{
    try
    {
        if (ModelState.IsValid)
        {
            Stage stage = _repository.GetStageByStageId(fixture.StageId);
            City city = _repository.GetCityByCityId(fixture.CityId);
            Team awayTeam = _repository.GetTeamByTeamName(fixture.AwayTeamName);
            Team homeTeam = _repository.GetTeamByTeamName(fixture.HomeTeamName);

            Fixture entity = new Fixture();
            entity.StageId = stage.StageId;
            entity.CityId = city.CityId;
            entity.FixtureDate = fixture.FixtureDate;
            entity.AwayTeamId = awayTeam.TeamId;
            entity.HomeTeamId = homeTeam.TeamId;
            entity.AwayTeamScore = fixture.AwayTeamScore;
            entity.HomeTeamScore = fixture.HomeTeamScore;

            db.Fixtures.Add(fixture);
            db.SaveChanges();
            var response = Request.CreateResponse(HttpStatusCode.Created, fixture);
            //response.Headers.Location = new Uri(Url.Link("DefaultApi", 
            //                                new { id = fixture.FixtureId }));

            return response;
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }
    catch
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
}

編輯:我已經使用了多個包含,並在Post方法中引用了導航屬性:

public override HttpResponseMessage Post(Fixture fixture)
{
    try
    {
        if (ModelState.IsValid)
        {
            Fixture entity = new Fixture();
            entity.StageId = fixture.Stage.StageId;
            entity.CityId = fixture.City.CityId;
            entity.FixtureDate = fixture.FixtureDate;
            entity.AwayTeamId = fixture.AwayTeam.TeamId;
            entity.HomeTeamId = fixture.HomeTeam.TeamId;
            entity.AwayTeamScore = fixture.AwayTeamScore;
            entity.HomeTeamScore = fixture.HomeTeamScore;

            db.Fixtures.Add(entity);
            db.SaveChanges();
            var response = Request.CreateResponse(HttpStatusCode.Created, fixture);

            return response;
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }
    catch
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
}

但是我收到一個400 Bad Request錯誤,當我檢查傳遞的對象時,它看起來像這樣

request: Object
body: "{"FixtureId":0,"StageId":0,"CityId":0,"FixtureDate":"2014-09-08T21:00:00.000","AwayTeamId":0,"HomeTeamId":0}"
callbackParameterName: "$callback"
data: Object
AwayTeam: undefined
AwayTeamId: 0
AwayTeamScore: undefined
City: undefined
CityId: 0
FixtureDate: "2014-09-08T21:00:00.000"
FixtureId: 0
HomeTeam: undefined
HomeTeamId: 0
HomeTeamScore: undefined
Stage: undefined
StageId: 0

用戶界面如下所示,所有下拉列表均已成功填充:

    <div data-ng-app="app" ng-controller="FixtureAddController">
    <form name="form" class="col-xs-2" id="form" class="form-horizontal">
        <div class="control-group" ng-class="{error: form.StageName.$invalid}">
            <label class="control-label" for="StageName">Stage Team</label>
            <div class="controls">
                <select class="form-control" ng-model="fixture.StageName" ng-options="stage.StageName as stage.StageName for stage in stages" required>
                    <option style="display:none" value="">Select</option>
                </select>
                <span ng-show="form.StageName.$dirty && form.StageName.$error.required">Stage required</span>
            </div>
        </div>
        <div class="control-group" ng-class="{error: form.CityName.$invalid}">
            <label class="control-label" for="CityName">City</label>
            <div class="controls">
                <select class="form-control" ng-model="fixture.CityName" ng-options="city.CityName as city.CityName for city in cities" required>
                    <option style="display:none" value="">Select</option>
                </select>
                <span ng-show="form.CityName.$dirty && form.CityName.$error.required">City required</span>
            </div>
        </div>
        <div class="control-group" ng-class="{error: form.FixtureDate.$invalid}">
            <label class="control-label" for="BirthDate">Fixture Date</label>
            <div class="controls">
                <input type='text' class="form-control" ng-model='fixture.FixtureDate' name='FixtureDate' title="FixtureDate" ng-pattern='/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/' required />
                <span ng-show='form.FixtureDate.$dirty && form.FixtureDate.$error.required'>Fixture Date required</span>
                <span ng-show='form.FixtureDate.$dirty && form.FixtureDate.$error.pattern'>Fixture Date invalid</span>
            </div>
        </div>
        <div class="control-group" ng-class="{error: form.HomeTeamName.$invalid}">
            <label class="control-label" for="HomeTeamName">Home Team</label>
            <div class="controls">
                <select class="form-control" ng-model="fixture.HomeTeamName" ng-options="team.TeamName as team.TeamName for team in teams" required>
                    <option style="display:none" value="">Select</option>
                </select>
                <span ng-show="form.HomeTeamName.$dirty && form.HomeTeamName.$error.required">Home Team required</span>
            </div>
        </div>
        <div class="control-group" ng-class="{error: form.AwayTeamName.$invalid}">
            <label class="control-label" for="AwayTeamName">Away Team</label>
            <div class="controls">
                <select class="form-control" ng-model="fixture.AwayTeamName" ng-options="team.TeamName as team.TeamName for team in teams" required>
                    <option style="display:none" value="">Select</option>
                </select>
                <span ng-show="form.AwayTeamName.$dirty && form.AwayTeamName.$error.required">Away Team required</span>
            </div>
        </div>
        <br />
        <div class="form-actions">
            <button ng-show="form.$valid" ng-click="save()" class="btn btn-primary">{{action}}</button>
            <a href="/Admin/Fixtures/List" class="btn btn-danger">Cancel</a>
        </div>
    </form>
</div>

我將如何成功完成發布?

編輯2:例如,當我在UI中將fixture.CityId更改為fixture.City.CityName以將下拉列表中的值綁定到fixture.City.CityName對象時,我發布以下錯誤:

Exception {name: "HTTP request failed", message: "{"$id":"1","Message":"No HTTP resource was found t…http://lovelyjubbly.cloudapp.net/odata/$batch'."}", data: Object, stack: (...), _getStackTrace: function…}
data: Object
message: "HTTP request failed"
request: Object
body: "
↵--batch_c20a-c604-4067
↵Content-Type: multipart/mixed; boundary=changeset_3cce-3259-213d
↵
↵--changeset_3cce-3259-213d
↵Content-Type: application/http
↵Content-Transfer-Encoding: binary
↵
↵POST Cities HTTP/1.1
↵Content-Id: 1
↵MaxDataServiceVersion: 3.0
↵DataServiceVersion: 3.0
↵Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1
↵Content-Type: application/json;odata=verbose
↵
↵{"CityId":0,"CityName":"Brasilia"}
↵--changeset_3cce-3259-213d
↵Content-Type: application/http
↵Content-Transfer-Encoding: binary
↵
↵POST Fixtures HTTP/1.1
↵Content-Id: 2
↵MaxDataServiceVersion: 3.0
↵DataServiceVersion: 3.0
↵Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1
↵Content-Type: application/json;odata=verbose
↵
↵{"FixtureId":0,"StageId":0,"CityId":0,"FixtureDate":"2012-11-10T22:00:00.000","AwayTeamId":0,"HomeTeamId":0,"City":{"__metadata":{"uri":"$1"}}}
↵--changeset_3cce-3259-213d--
↵
↵--batch_c20a-c604-4067--
↵"
callbackParameterName: "$callback"
data: Object
__batchRequests: Array[1]
0: Object
__changeRequests: Array[2]
0: Object
body: "{"CityId":0,"CityName":"Brasilia"}"
data: Object
headers: Object
method: "POST"
requestUri: "Cities"
__proto__: Object
1: Object
body: "{"FixtureId":0,"StageId":0,"CityId":0,"FixtureDate":"2012-11-10T22:00:00.000","AwayTeamId":0,"HomeTeamId":0,"City":{"__metadata":{"uri":"$1"}}}"
data: Object
headers: Object
method: "POST"
requestUri: "Fixtures"
__proto__: Object
length: 2

第一個問題-是的,您可以包含多個導航屬性。

return db.Fixtures
    .Include("Stage")
    .Include("FixtureDate")
    .Include("AwayTeam");

等等

編輯關於第二個問題-如果您已將Fixtures類定義為具有這些導航屬性,並且db的負載將帶所有相關“ includes”的完整圖帶回來,則該模型在Controller>之后仍應完好無損查看>控制器流程。 這意味着你應該能夠只是獲得的數據等Fixture.AwayTeam.Name (或其他的屬性AwayTeam可能看起來像)。

您還可以將完整模型/圖形的更改提交給EntityFramework,但是像這樣的斷開連接的圖形,您將需要制定一種策略,該策略如何為圖形的每個部分正確設置EntityState,否則在執行諸如此類的操作時會出錯:-提交使用現有AwayTeam的新燈具(EF將嘗試創建新的AwayTeam,而不是將現有的AwayTeam鏈接到新的燈具)-提交編輯后的燈具和編輯過的AwayTeam

編輯2對不起,剛意識到我要引進EF,而您的問題與EF無關。 忽略EF細節!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM