如何在不使用EF上下文的情况下使用breeze和angular执行保存操作

时间:2015-01-03 15:45:25

标签: angularjs breeze

在我的项目中,我尝试执行保存操作,更新我的Breeze模型,并将更新的对象传递给我的webAPI。在这个项目中,我没有使用EF上下文,因为项目已被建模为与其他接口一起使用。所以在我的webAPI课程中,我有以下内容:

  [BreezeController]
    public class ReportLibraryApiController : ApiController
    {
       readonly long userid = 1;//testing
       readonly IReportLibraryManager manager = new ReportLibraryManager();//interface 

        //method for share
        [Route("reportlibrary/SetReportShare/")]
        [HttpPost]
        public DTOs.Report SetReportShare(JObject report )
        {
             //within here I plan to unwrap the JSobject and pull out the necessary 
             //fields that I need 
            DTOs.Report updatedreport=null;

            //manager.ShareReport(updatedreport.ReportId);
            //manager.UnShareReport(updatedreport.ReportId);
            return updatedreport;
        }
}

报告对象看起来像这样

public class Report
{

    public Int64 ReportId { get; set; }
    public string ReportName { get; set; }
    public string ReportDescription { get; set; }
    public DateTime? ReportDateCreated { get; set; }
    public string ReportOwner { get; set; }
    public IEnumerable<ReportLabel> ReportLabels { get; set; }
    public bool IsShared { get; set; }
    public bool IsFavorite { get; set; }
}

从我的角度服务我试图将保存操作称为:

app.factory('reportLibraryService',  function(breeze,  model){

        var serviceName = "reportlibrary/";

        var ds = new breeze.DataService({
            serviceName: serviceName,
            hasServerMetadata: false,
            useJsonp: true,

        });

        var manager = new breeze.EntityManager({ dataService: ds });

        model.initialize(manager.metadataStore);

        function returnResults(data){ return data.results}

        function setReportShare(report) {
           var option = new breeze.SaveOptions({ resourceName: 'SetReportShare' })
           return  manager.saveChanges(null, option).then(returnResults)
        };
}

我意识到返回结果可能不正确,但此时我只是试图在API中调用save操作。当我运行代码时,一切都会执行,但共享的保存/设置不会触发。第二个问题是我还不清楚微风模型是如何更新的?我应该从api发出一个新的查询并将其传回,或者是否有办法更新缓存的对象。我很清楚(很明显)并试图找出去哪里看。到目前为止我看到的所有例子都使用EF上下文来执行这些操作。但是在我的情况下,我没有这个选择。

如果微风正在进行通话,或者因为我没有使用EF,我应该使用$http指令来推动对象。然后将一个新对象返回到breeze进行绑定? (这对我来说似乎有点沉重,现在它是如何设计的)。 我很欣赏任何指导,信息或如何解决这个问题。

已编辑以获取更多信息...... 以下是基于Ward发给我原始问题的一些问题的更多细节:

您编码的元数据在服务器上的哪个位置?

我正在处理的解决方案目前尚未公开EF上下文。因此,创建了处理项目中的查询等的接口。因此,我没有能力使用EF。与Edmunds样本非常相似。我在Web项目中创建了一个元定义,它引用了我定义的报表对象。此类与从数据库返回的内容有很大不同,但它代表了UI所需的内容。我创建了两个模型

report.cs

公共课报告 {

public Int64 ReportId { get; set; }
public string ReportName { get; set; }
public string ReportDescription { get; set; }
public DateTime? ReportDateCreated { get; set; }
public string ReportOwner { get; set; }
public IEnumerable<ReportLabel> ReportLabels { get; set; }
public bool IsShared { get; set; }
public bool IsFavorite { get; set; }

}

model.js

app.factory('model', function () {

    var DT = breeze.DataType;
    return {
        initialize: initialize
    }

    function initialize(metadataStore) {
        metadataStore.addEntityType({
            shortName: "Report",
            namespace: "Inform.UI.DTOs",
            dataProperties: {
                reportId: { dataType: DT.Int64, isPartOfKey: true },
                reportName: { dataType: DT.String },
                reportDescription: { dataType: DT.String },
                reportDateCreated: { dataType: DT.String },
                reportOwner: { dataType: DT.String },
                reportLabels: { dataType: DT.Undefined },
                isShared: { dataType: DT.Bool },
                isFavorite: { dataType: DT.Bool }
            },
            navigationProperties: {
                labels: {
                    entityTypeName: "Label:#Inform.UI.DTOs", isScalar: false,
                    associationName: "Report_Labels"
                }
            }
        });
        metadataStore.addEntityType({
            shortName: "ReportLabel",
            namespace: "Inform.UI.DTOs",
            dataProperties: {
                labelId: { dataType: DT.Int64, isPartOfKey: true },
                reportId: { dataType: DT.Int64 },
                labelName: { dataType: DT.String },
                isPublic: { dataType: DT.Bool },
                reports: { dataType: DT.Undefined }
            },
            navigationProperties: {
                labels: {
                    entityTypeName: "Report:#Inform.UI.DTOs", isScalar: false,
                    associationName: "Report_Labels", foreignKeyNames: ["reportId"]
                }
            }
        });
    }
})

为什么要配置useJsonp = true ...然后POST到SetReportShare端点?

dataservice最初是为GET请求定义的,用于查询/返回客户端的结果。我重用了dataservice并加入了POST事件。根据你的评论,虽然我认为这是一个禁忌。在查看项目时,我在同一个域内工作(并且总是如此),所以我并不认为我需要jsonp作为dataservice定义的一部分。我错了吗? 我从你的问题中得知,我应该为POST提供单独的数据服务,并为GET提供单独的数据服务

为什么它会返回DTOs.Report类型,你可以通过查看标准的Breeze SaveChanges方法告诉它返回一个SaveResult?

这是我的错字。保存结果最初定义为JObject。我的意图是返回(如有必要)更新的Report对象。但是我不确定这里的最佳做法。如果客户端(breeze)正在更新缓存对象。为什么我需要返回报表对象。仅返回成功失败结果或某种布尔值与返回整个报表对象不是更好吗?

为什么您的客户端saveChanges回调将响应视为来自查询?

如你所说,这很简单,我不知道我在做什么。由于我现在没有选择,我当然潜入了深渊......我的问题是,当你执行CRUD操作时,这些操作是否包含在执行查询时的承诺中?或承诺只对查询很重要?

再次感谢你 -

-cheers

1 个答案:

答案 0 :(得分:1)

你知道如何游泳,你会跳入深渊。

你还没有解释为什么你会变异。那没关系,但你想要轻松一点。我强烈建议您从“快乐”路径开始 - Web API,EF,SQL Server - 然后在您开始了解正在发生的事情时慢慢解开它们。

如果你不能这样做,至少要查看不使用EF或SQL Server的NoDb sample(参见TodoRepository)。

你绝对可以做你正在努力做的事情......一旦你知道如何......或找到一个人。

此时,除了问题,你什么都没创造。例如,

  • 您编码的元数据位于服务器上的哪个位置?

  • 为什么要配置useJsonp = true ...然后POST到SetReportShare端点?

  • 为什么通过查看标准的Breeze DTOs.Report方法判断它返回SaveChanges时会返回SaveResult类型?

  • 为什么您的客户端saveChanges回调会将响应视为来自查询?

关于你的问题:

  • 保存完成后,breeze模型会自动更新
  • 不,您不从api
  • 发出新查询
  • 是的,你可以(并且通常会)在SaveResult中返回服务器更新的对象。
  • $ http(一种方法而非指令)被Breeze本身用于与服务器通信;直接使用它不会改变任何东西。

不确定我的任何答案都有帮助。但我确实认为如果你从顶部开始并且从你理解的一件事情到另一件事故意向前工作,你会没事的。