1

每次我上传新图像并将其与个人资料链接时,它也会在错误的数据库中创建一个新的个人资料。

我想它是通过以下代码创建的:

var imageMeta = new ImageMeta
    {
        Name = imageForm.Name,
        User = Profile,
    };
...
db.Images.Add(imageMeta);
db.SaveChanges();

Profile我从哪里来BaseController

public class BaseController : Controller
{
    private UsersContext _udb = new UsersContext();
    private UserProfile _profile = null;

    public new UserProfile Profile
    {
        get
        {
            if(_profile == null && User.Identity.IsAuthenticated)
            {
                _profile = _udb.UserProfiles.Single(p => p.UserName == User.Identity.Name);
            }
            return _profile;
        }
    }
}

该方法Profile.get从 中提取登录用户的正确配置文件UsersContext,但db第一个片段中的实际是GalleryContext.

我猜它在该数据库/上下文中看不到配置文件,所以它正在创建表并将新记录插入其中?我可以告诉它不要那样做吗?用户和图像只是存储在两个不同的数据库中。

我不介意将它们放在同一个数据库中,但它似乎不喜欢将 DefaultContext 用于我的 images

4

1 回答 1

2

如果您ImageMetaUserProfile属于两个独立的数据库,那么您几乎没有选择。

您可以提供标量属性,而不是在类中拥有UserProfile类型属性。UserImageMetaUserId

public class ImageMeta
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int UserId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<ImageFile> Files { get; set; } 
}

然后ImageMeta插入看起来像

var imageMeta = new ImageMeta
    {
        Name = imageForm.Name,
        UserId = Profile.Id,
    };
...
db.Images.Add(imageMeta);
db.SaveChanges();

您可以创建数据库的物化视图UserProfileGalleryContext然后两个上下文将使用同一个表。之后,您可以在保存时将Profile实例从中分离UsersContext并附加到。GalleryContextImageMeta

于 2012-09-05T03:49:18.067 回答