c# - 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 中的记录。
我希望你明白我想说什么。
解决方案
在这种情况下继承是错误的。当从某物继承时,你应该问自己这个问题:“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 将在您的数据库中生成的。它们仅用于演示目的
推荐阅读
- css - 为什么 box-shadow 会像这样出现在元素下方
- c++ - 我将如何返回动态二维向量或字符?
- opengl - 使用矩阵OpenGL绘制线
- python - 熊猫群比;if 条件:sum else:基于另一列的给定列的最大值
- botframework - 与在典型的 Web 应用托管上托管机器人相比,在 Azure 机器人服务上托管机器人的好处
- node.js - 当两者都在 docker 环境中启动时,如何从节点服务器连接到 postgres
- python - 第一个字符出现后的 Python 正则表达式匹配组
- docker - 在没有 root 访问权限的系统上构建 Docker 映像
- angular - Angular/NGXS 示例代码 - 无法获取参数输入的引用
- android-intent - 如何从我的网络应用程序打开 whatsappcontacts