首页 > 解决方案 > DTO如何在内部绑定到实体框架中

问题描述

实际上,我正在尝试使用 DTO(POCO 类)为 CRUD 操作创建一个通用库。

但是在 API 中,我们有许多复杂的请求和响应。所以我想创建自己的格式来进行 CRUD 操作。所以我试图了解 DTO 如何在实体框架中绑定,以便我可以创建一个逻辑,以便我可以将任何 DTO 直接保存在数据库中。

例如

当我们使用实体框架在数据库中保存任何内容时,我们只需像这样传递完整的 DTO 对象。

context.Add(author);
context.SaveChanges();

在我的情况下,作者 DTO 有更多不用于保存目的的属性,当我发送响应时使用了额外的属性。所以这个额外的属性抛出错误表示当我通过这段代码保存时这个额外的属性与列不匹配

context.Add(author);
context.SaveChanges();

所以简单来说,我想创建一个通用方法,我可以在 DTO 中发送尽可能多的属性,但它只保存那些与数据库表匹配的属性。

这里有完整的细节

(场景一) 假设我有 DTO 作者

class Author
{
    public int AuthorId {get;set;}
    public int AuthorName {get;set;}
    public int AuthorAge {get;set;}
}

有一个带有列的表

AuthorId
AuthorName
AuthorAge

当我使用

context.Add(author);
context.SaveChanges();

它工作正常。

(情景二)

class Author
{
    public int AuthorId {get;set;}
    public int AuthorName {get;set;}
    public int AuthorAge {get;set;}
}

class Book : Author
{
    public int BookId {get;set;}
    public int BookName {get;set;}
}

和有列的表

BookId ,
BookName ,
AuthorId 

在这种情况下,当我使用保存数据时

context.Add(books);
context.SaveChanges();

它会给出错误。

并且通过对 AuthorName 执行 [NotMapped] ,AuthorAge 将不会保存方案 1 中的记录。

我希望你明白我想说什么。

标签: c#entity-framework-core

解决方案


在这种情况下继承是错误的。当从某物继承时,你应该问自己这个问题:“X 也是 Y 吗?” 在这种情况下,“书是作者吗?”,它不是。一本书有一个作者,所以我们需要一个对它的引用,而不是从作者继承。

在普通课程中,我们会这样做:

public class Book
{
    public Author Author {get; set;}
}

但是因为这不是一个普通的类,而是一个实体框架的模型,我们需要这样做:

public class Book
{
    public int BookId {get; set;}
    public string BookName {get; set;}
    public int AuthorId {get; set;}
    public virtual Author Author {get; set;}
}

像这样保持你的 Author 类

public class Author
{
    public int AuthorId {get; set;}
    public int AuthorName {get; set;}
    public int AuthorAge {get; set;}
}

在数据库上,这将创建两个表:

Author Table:
|AuthorId|AuthorName|AuthorAge|
|--------|----------|---------|
|...     |...       |...      |
|--------|----------|---------|

Book Table:
|BookId|AuthorId|BookName|
|------|--------|--------|
|...   |...     |...     |
|------|--------|--------|

Book 表中AuthorId的 是 Author 表的外键AuthorId

您现在可以通过执行轻松访问任何书籍的作者信息book.Author.AuthorName

PS 请注意,这些表是示例,它们的实际名称和列的名称不是 EF 将在您的数据库中生成的。它们仅用于演示目的


推荐阅读