在我的申请中,我有两个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样本 - 非常感谢任何帮助
答案 0 :(得分:2)
在EF一对一的关系中,FK也必须是PK,所以你不应该使用Email作为用户PK。
即使你正在做什么(即不使用PK作为FK),你仍然会遇到问题,因为你在用户中将你的FK标记为未映射。
Breeze关联需要外键,如果您在DB中没有该信息,则Breeze无法解析该关系。
所以我建议你在用户和PK中设置Id并将Email设置为唯一。对于后者,您可能需要检查Unique Constraint in Entity Framework Code First。