1

私のアプリケーションには、User と Company という 2 つの EF エンティティがあります。これら 2 つのエンティティは 1 対 1 の関係にあります。

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 コントローラーには、次の 2 つのメソッドがあります。

[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 がオブジェクトを正しくデシリアライズしないのはなぜですか? user2. オブジェクト グラフをクライアント側で正しく構築して、ユーザー インターフェイス要素をuser.companyプロパティにバインドできるようにするにはどうすればよいですか?

私はすべての Breeze サンプルを試してみましたが、運が悪かったです - どんな助けも本当に感謝しています

4

1 に答える 1

2

EF の 1 対 1 の関係では、FK も PK である必要があるため、E メールをユーザー PK として使用しないでください。

あなたがしていること (つまり、PK を FK として使用しないこと) が可能であったとしても、ユーザーで FK をマップされていないものとしてマークしたため、依然として問題が発生します。

Breeze アソシエーションには外部キーが必要であり、DB にその情報がない場合、Breeze がリレーションを解決することはできません。

そのため、User と PK に Id を設定し、Email を一意に設定することをお勧めします。後者については、Entity Framework Code First の Unique Constraintを確認することをお勧めします。

于 2013-09-03T22:53:37.060 に答える