我是不是必须进行选择查询才能在实体框架中创建关系?

Posted

技术标签:

【中文标题】我是不是必须进行选择查询才能在实体框架中创建关系?【英文标题】:Do I have to make a select query to create a relationship in Entity Framework?我是否必须进行选择查询才能在实体框架中创建关系? 【发布时间】:2010-10-01 08:03:45 【问题描述】:

我想创建一个与 User 有关系的 Blog 对象。要创建关系,我是否必须先选择 User 实体,然后将其设置为 Blog 对象的 User 属性?在 Entity Framework 示例中,建议将 User 对象设置为 ViewState 并在需要创建关系时检索它,例如基本缓存。

这有必要吗?有没有其他方法可以做到这一点? (就像在 linq-to-sql 中只设置外键而不选择。)

这是我的代码示例;

Blog blog = new Blog
            
                Name = blogName,
                Slogan = slogan,
                User = Entities.Users.First(u => u.Id == userId)
            

Entities.AddToBlogs(blog);
Entities.SaveChanges();

编辑(再给一次提问的机会):有什么不清楚的地方吗?

【问题讨论】:

还是没有答案?你们让我感到惊讶:) 是不清楚还是其他什么? 【参考方案1】:

我们使用以下解决方案来设置外键,而无需从上下文中检索相应的实体。

Blog blog = new Blog            
                
   Name = blogName,                
   Slogan = slogan,                
   UsersReference.EntityKey = new EntityKey("EntityModel.Users", "UserId", userId)            


Entities.AddToBlogs(blog);
Entities.SaveChanges();

【讨论】:

【参考方案2】:

目前官方不支持这个,but it may be included in a future version。

不过,你或许可以破解它。我没有尝试过,但这个想法在概念上似乎是合理的:

    创建一个新用户,并适当地设置 ID。将其附加到对象上下文。 告诉对象上下文忘记您到目前为止所做的任何更改。 现在创建一个新博客并将 User 属性设置为您刚刚创建的用户。 保存对对象上下文的更改。

显然,如果数据库中实际不存在用户,这将失败。

似乎是个好主意,但似乎行不通。 :(

【讨论】:

不幸的是,这并没有解决问题。当我这样做时,正在尝试添加博客的属性,并且由于限制而引发异常。 这样做的方法是什么?我在 DataContext 上找不到任何方法来做到这一点。所以我使用了 AcceptAllChanges()。 AcceptAllChanges 应该这样做。检查实体状态以确保。正如我所说,这是我的猜测;您的要求不受官方支持。 我检查过了。但是当我尝试添加博客时,用户的实体状态变成了已添加,无法手动设置。 好的,那么我们可以将这个想法添加到在现实生活中不起作用的好想法的垃圾箱中。 :(

以上是关于我是不是必须进行选择查询才能在实体框架中创建关系?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在实体框架中创建这种关系?

如何在 C# 和 WPF 中的实体框架中创建数据库和表?

如何在 SQL Server 或实体框架中创建没有主键的一对多关系?

实体框架 6 不在 SQLite 数据库中创建表

如何在实体框架数据库迁移中创建全文目录? [复制]

如何在实体框架中创建只读实体?