导航属性未正确加载

时间:2013-09-03 18:47:00

标签: javascript asp.net-web-api breeze

在我的申请中,我有两个EF实体,一个是用户和一个公司。这两个人有一对一的关系。

public class Company : IEntity
{
    public virtual int Id { get; set; }
    [Required]
    public virtual User Owner { get; set; }
    public virtual String Name { get; set; }
    public virtual String Address { get; set; }
    public virtual byte[] Logo { get; set; }
}

一位用户:

public class User : IEntity
{
    [NotMapped]
    public virtual int Id { get; private set; }
    [Key]
    [Required]
    public virtual string Email { get; set; }
    public String Name { get; set; }
    public virtual Company Company { get; set; }
}

我使用以下Breeze js代码查询这些对象:

var query = EntityQuery.from('CurrentUser').expand('Company');

web api控制器有以下两种方法:

[HttpGet]
public IQueryable<User> CurrentUser()
{
    var userName = ...
    return _breezeContext.Context.Users.Find(sup => sup.Email.Equals(userName)).AsQueryable();
}

[HttpGet]
public IQueryable<Company> Company()
{
    var userName = ...
    return _breezeContext.Context.Companies.Find(cmp => cmp.Owner.Email.Equals(userName)).AsQueryable();
}

我可以清楚地看到这是从服务器回来的:

{$id:1, $type:User, MyNamespace, Id:0, Email:something@something.com,…}
$id: "1"
$type: "MyNamespace.Models.User, MyNamespace"
Company: {$id:2, $type:MyNamespace.Models.Company, MyNamespace, Id:1, Owner:{$ref:1}, Name:My Company,…}
$id: "2"
$type: "MyNamespace.Models.Company, MyNamespace"
Address: "somewhere in the world"
Id: 1
Logo: {$type:System.Byte[], mscorlib,…}
Name: "company"
Owner: {$ref:1}
Email: "something@something.com"
Id: 0
Name: "Operator 2"

现在在我的js代码中,我可以正确地看到User对象,但不能看到Company。 User.company也是undefined

问题  1.上面的代码有什么问题,为什么Breeze没有正确地反序列化我的对象?  2.如何在客户端正确构建对象图,以便将用户界面元素绑定到useruser.company属性?

我在没有运气的情况下浏览了所有Breeze样本 - 非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

在EF一对一的关系中,FK也必须是PK,所以你不应该使用Email作为用户PK。

即使你正在做什么(即不使用PK作为FK),你仍然会遇到问题,因为你在用户中将你的FK标记为未映射。

Breeze关联需要外键,如果您在DB中没有该信息,则Breeze无法解析该关系。

所以我建议你在用户和PK中设置Id并将Email设置为唯一。对于后者,您可能需要检查Unique Constraint in Entity Framework Code First