1

在我的应用程序中,我有两个 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. 如何让我的对象图在客户端正确构建,以便我可以将我的用户界面元素绑定到user属性user.company

我没有运气就浏览了所有 Breeze 样本 - 非常感谢任何帮助

4

1 回答 1

2

在 EF 一对一关系中,FK 也必须是 PK,因此您不应将电子邮件用作用户 PK。

即使您正在做的事情(即不使用 PK 作为 FK)是可能的,您仍然会遇到问题,因为您在 User 中将 FK 标记为未映射。

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

所以我建议你在 User 和 PK 中设置 Id 并将 Email 设置为唯一。对于后者,您可能需要先检查Entity Framework Code First 中的唯一约束

于 2013-09-03T22:53:37.060 回答