gpt4 book ai didi

c# - 如何在 EF Core 中插入外键影子属性?

转载 作者:行者123 更新时间:2023-12-05 09:02:08 25 4
gpt4 key购买 nike

EF Core 允许我们省略外键属性,因为导航属性的存在足以在两个实体之间建立关系。然后 EF Core 将创建所谓的 foreign key shadow property。在引擎盖下独立运行。

我将使用一个类似于文档中的示例:

public class Blog
{
public int Id { get; set; }
public string Title { get; set; }

public List<Post> Posts { get; set; }
}

public class Post
{
public int Id { get; set; }
public string Title { get; set; }

public Blog Blog { get; set; }
}

现在,给定这样一个结构,其中没有明确的外键属性,您将如何为具有给定 ID 的 Blog 创建一个新的 Post

我已经试过了:

db.Posts.Add(new Post() {
Title = "Some title",
Course = new Blog { Id = 1234 },
});
db.SaveChanges();

但是好像不行。这似乎是一个简单的问题,但令我惊讶的是,无论是在文档中还是在我访问过的任何其他地方都没有关于它的信息。

最佳答案

如果您使用的是 Shadow FK,则可以使用多种方法。第一个是获取相关实体。这意味着转到数据库,但好处是这断言您认为应该有效的博客 ID 是有效的:

var blog = db.Blogs.Single(x => x.Id == blogId);
var post = new Post
{
Title = title,
Blog = blog
};
db.Posts.Add(post);
db.SaveChanges();

作为一般规则,您不应相信来自客户的任何信息。如果您确实想假设 ID 有效并且不想往返,那么安全的方法是:

var blog = db.Blogs.Local.SingleOrDefault(x => x.Id == blogId);
if (blog == null)
{
blog = new Blog { Id = blogId };
db.Attach(blog);
}

var post = new Post
{
Title = title,
Blog = blog
};
db.Posts.Add(post);
db.SaveChanges();

这将检查 DbContext 以查找本地缓存的 Blog 实例(不访问 DB)并在找到时使用它。如果找不到,我们创建一个并附加它,然后将其与 Post 相关联。我们应该在附加实例之前检查本地缓存,因为如果您跳过该步骤并且出于任何原因 DbContext 已经在跟踪具有该 ID 的博客,则 Attach 调用将失败。

使用这种方法的一个警告是,与获取实际的博客条目不同,创建的博客不是一个完整的博客,因此发送该帖子或类似的任何地方可能期望 post.Blog 是一个完整的博客(如获取名称、作者等)将无法看到有关博客的任何详细信息。仅当您信任输入并且创建的实体除了在数据库中创建所需的行之外不会被引用时才应使用此方法。

关于c# - 如何在 EF Core 中插入外键影子属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71898383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com