簡體   English   中英

如何在沒有反向導航屬性的實體框架中配置外鍵?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM