【问题标题】:Breeze - Create Entity on Server sideBreeze - 在服务器端创建实体
【发布时间】:2013-12-03 23:00:09
【问题描述】:

我想在服务器端创建我的微风实体,而不是使用微风实体管理器.createEntity,这样我就可以设置实体的属性;我不想在客户端这样做。

服务器端 api 控制器:

[HttpGet]
public Foo CreateFoo() 
{

    Foo f = new Foo()
    {
       PrimaryKey = Guid.NewGuid(),
       SomeProperty = "XXX";
    };

    return f;
    // return _contextProvider.Context.Users.Add(user); TRIED THIS TOO

}

[HttpGet]
public string Metadata()
{
   return _contextProvider.Metadata();
}

客户端 -

var query = breeze.EntityQuery.from("CreateFoo");
manager.executeQuery(query).then(function(data) {

    // returned entity has entityState "Unchanged" here

    // this fixes, but is it correct? - YES per accepted answer's comments 
    data.results[0].entityAspect.entityState = breeze.EntityState.Added; 

    return data;
});

我已经尝试了多种方法,但当我调用 SaveChanges 时,总是在服务器端出现并发异常。

我该怎么做?

【问题讨论】:

    标签: entity-framework breeze


    【解决方案1】:

    几个问题,

    1. 客户端上是否有“Foo”类型的元数据。 (通过元数据端点或使用 MetadataStore api 在客户端上创建)
    2. 您在哪里为“Foo”实例分配主键?
    3. 您是否正在更新或至少设置“Foo”实例的并发字段(假设有一个)?

    【讨论】:

    • Jay,我已经更新了我的问题,希望能回答 1 和 2 - 是的,我有一个元数据端点,我正在此服务器端方法中设置主键。不确定 3,所以我猜这个答案是否定的。
    • 检查“Foo”类型的 EntityType 元数据以查看是否定义了并发字段。如果是这样,请在保存之前进行设置。如果没有,请回帖。
    • Jay - 我在数据库/模型中添加了一个时间戳字段,它在 EF 中是“计算的”。仅此一项并不能解决我的问题,但在客户端,我现在在使用之前将微风实体 entityAspect.entityState 设置为 EntityState.Added,这确实解决了问题。但是我想知道这是否是正确的做法?我将此添加到我的问题中
    • 是的,这是正确的,因为默认情况下查询返回“现有”实体。您正在绕过系统并使用查询创建一个“新”实体,因此您的解决方法确实有意义。您收到并发异常的原因是 Breeze 试图“更新”该实体的一个实例但找不到它,因此认为这是一个并发错误(即另一个用户已更新它)。跨度>
    • 并发字段帮助确认了问题。既然您知道如何使用EntityState.Added 来实现您的目的,您就不需要并发属性了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多