MVC、Entity Framework、Durandal、Breeze JS を使用しています。次のようなユーザーがいます(簡略化):
public class User : EntityBase<Guid>, IAggregateRoot
{
public Guid Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[ForeignKey("UserImage")]
public virtual Guid? ImageId { get; set; }
public virtual UserImage UserImage { get; set; }
}
UserImage クラスはこんな感じです。画像のサイズを制限する必要があることはわかっています。(多分これが問題ですか?):
public class UserImage
{
public Guid Id { get; set; }
[MaxLength]
public byte[] Image { get; set; }
}
現在のユーザーを取得するために、サーバー上に api 関数があります。
public IQueryable<User> GetCurrentUser()
{
IPrincipal principal = HttpContext.Current.User;
var users = _uow.Users.FindBy(u => u.UserName.Equals(principal.Identity.Name));
if (!users.Any())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
}
return users;
}
そして、現在のユーザーを取得するクライアントでの 2 つの呼び出し。最初はシェルにあります:
function loadCurrentUser() {
return uow.CurrentUser.all().then(function (newUser) {
log('Welcome to the Site ' + newUser[0].FullName() + '!', newUser[0], true);
config.CurrentUser(newUser[0]);
return true;
});
}
2 番目は ManageUser ビューモデルにあります。
function activate() {
return uow.CurrentUser.all(['UserImage']).then(function (user) {
self.CurrentUser(user[0]);
return $.when(init()).then(boot());
}).fail(function() {
return router.activate('accounts/login');
});
}
これで、イメージを ManageUser ページにロードして保存できます。フィドラーでは、ImageId とイメージがサーバーに送信されていることがわかります。次に、BeforeSaveEntity インターセプトを確認したところ、2 つのエンティティが保存されていることがわかりました。
- ImageId が設定された更新されたユーザー
- 新しいユーザーイメージ
データはデータベースにも表示されます。[ユーザーの管理] ページを更新すると、フィドラーで 2 つの GetCurrentUser 呼び出しが表示されます。
- シェル呼び出しから、ユーザーが返され、ImageId が設定されていることがわかりますが、クエリを展開しなかったため、UserImage は送信されませんでした。
- Manage User 呼び出しから、User が返されていることがわかりますが、ImageId のみが送信され、Image オブジェクトは JSON から省略されました。
画像でこの問題に遭遇した人はいますか? 他のすべての展開は正しく機能しているようです。イメージへのファイルパスだけを保存するためにそよ風を使用し、おそらくメディアストレージに Windows azure を使用する例はありますか?