[英]How to configure foreign key in Entity Framework without an inverse navigation property?
我是 Entity Framework 的新手,我正在嘗試讓幾個模型工作。 我將使用此 microsoft 文檔中的實體作為示例,因為它是我正在遵循的指導自己的實體。
我的實體(沒有不相關的屬性)看起來像這樣:
public class Blog
{
public Guid Id { get; set; }
public List<Post> Posts { get; set; } = new List<Post>();
}
public class Post
{
public Guid Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
但我的數據庫看起來像這樣:
Blogs
表
柱子 | 類型 |
---|---|
ID | 唯一標識符 |
Posts
表
柱子 | 類型 |
---|---|
ID | 唯一標識符 |
標題 | nvarchar |
內容 | nvarchar |
博客 ID | 唯一標識符 |
注意Posts
表中的外鍵BlogId
。 另請注意,該屬性未在代碼中的Post
實體中顯式定義。
當我嘗試使用 EF 進行插入時,出現以下錯誤:
失敗:Microsoft.EntityFrameworkCore.Update[10000]
保存上下文類型“MyNamespace.DatabaseContext”的更改時,數據庫中發生異常。
Microsoft.EntityFrameworkCore.DbUpdateException:保存實體更改時出錯。 有關詳細信息,請參閱內部異常。
Microsoft.Data.SqlClient.SqlException (0x80131904):無法將值 NULL 插入到列 'BlogId'、表 'Posts' 中; 列不允許空值。 插入失敗。
它試圖向Posts
表中的BlogId
列插入一個NULL
值,但我希望它從定義該Post
對象的Blog
對象中獲取 id。 (帖子不能存在於博客之外,因此應始終在List<Posts>
中定義它們)
我所做的如下:
public class DatabaseContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DatabaseContext()
{
}
public DatabaseContext(DbContextOptions<DatabaseContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasMany<Post>(b => b.Posts);
modelBuilder.Entity<Post>()
.HasOne<Blog>()
.WithMany(b => b.Posts)
.HasForeignKey(b => b.Id);
}
}
這是我的問題:如何在不向Post
模型添加BlogId
屬性的情況下讓 EF 從包含帖子的博客中獲取 id? 甚至有可能還是我被迫調整模型的屬性?
另外,我正在使用 EF 和數據庫優先的方法。
編輯:有關代碼的更多信息。
API 接收Blog
的 id 和帖子的屬性以在該博客中創建新帖子。 之后一個命令運行
...
var blog = await context.Set<Blog>().FindAsync(
keyValues: new object?[] { id }, cancellationToken);
blog.Posts.Add(new Post
{
Title = title,
Content = content
});
await context.SaveChangesAsync(cancellationToken);
由於您首先使用數據庫,因此您可以使用外鍵創建表並鍵入此命令
Scaffold-DbContext "Server=localhost;Database=[DatabaseName];Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -force
EF 將在 Models 文件夾中為您生成模型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.