Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么MVC要创建所有这些新的配置文件?_C#_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 为什么MVC要创建所有这些新的配置文件?

C# 为什么MVC要创建所有这些新的配置文件?,c#,entity-framework,asp.net-mvc-4,C#,Entity Framework,Asp.net Mvc 4,每次我上传一个新图像并将其与一个配置文件链接时,它也会在错误的数据库中创建一个新的配置文件 我想它是通过以下代码创建的: var imageMeta = new ImageMeta { Name = imageForm.Name, User = Profile, }; ... db.Images.Add(imageMeta); db.SaveChanges(); 其中Profile来自myBaseController: public class

每次我上传一个新图像并将其与一个配置文件链接时,它也会在错误的数据库中创建一个新的配置文件

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

var imageMeta = new ImageMeta
    {
        Name = imageForm.Name,
        User = Profile,
    };
...
db.Images.Add(imageMeta);
db.SaveChanges();
其中
Profile
来自my
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

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


我不介意将它们放在同一个数据库中,但它是。

如果您的
ImageMeta
UserProfile
属于两个独立的数据库,您几乎没有选择

您可以提供标量属性
UserId
,而不是
ImageMeta
类中的
UserProfile
类型
User
属性

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; } 
}

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

会占用很多便利性——然后我必须手动执行所有获取,不是吗?我想我必须这样做,因为它无论如何都不能处理跨数据库连接?“您可以在GalleryContext数据库上创建UserProfile的物化视图”是什么意思?@Mark Single
DbContext
只能使用一个数据库。您提到两个表位于不同的数据库中。因此,为了在单个上下文中使用这些属性(即连接、导航属性等),您可以在
GalleryContext
数据库中创建
Profile
表的视图。不过它们也是独立的
DBContext
UserContext
GalleryContext
,如问题中所述。我也不知道你说的“创建视图”是什么意思,我想我对MS SQL不是很熟悉,但不管怎样,我已经设法将所有内容都放到一个数据库中,只有一个
DbContext
,同样的问题也发生了。它仍在创建其他配置文件。如果
Profile.UserId
0
null
,我可以理解为什么它会这样做,但它设置正确,那么为什么它要尝试创建更多,而不仅仅是链接它呢?@标记这可能是因为您使用了上下文的两个实例。一个用于检索
配置文件
另一个用于保存
ImageMeta
。上下文实例跟踪已加载的实体。如果在跟踪列表中找不到实体实例,上下文会将其检测为新实体。Hrm..这是个问题。我想多个控制器使用同一个DbContext并不少见,那么人们如何解决这个问题呢?编辑:实际上,我可以通过使
\u udb
受保护,并停止在派生控制器中重新构造它来解决这个问题。
var imageMeta = new ImageMeta
    {
        Name = imageForm.Name,
        UserId = Profile.Id,
    };
...
db.Images.Add(imageMeta);
db.SaveChanges();