gpt4 book ai didi

c# - 使用 servicestack 和 c# 将数据发布到 sql server

转载 作者:行者123 更新时间:2023-11-30 15:15:48 24 4
gpt4 key购买 nike

我刚刚开始学习 servicestack 和 c#,我需要一些关于将数据发布到 sql server 的帮助。当我使用 swagger 进行测试时,我得到了 200 响应,但实际上没有任何内容被插入到数据库中,我不确定我哪里出错了。

模型.类型

public class Book
{
[PrimaryKey]
[AutoIncrement]
public int BookID { get; set; }
public string Author { get; set; }
public string Title { get; set; }
public int NumberOfPages { get; set; }
public int Isbn { get; set; }
}

管理界面:

namespace ServiceStackServiceLog4NetTemplate.Interfaces.Managers
{
public interface IPostBookManager
{
Book CreateBooks();
}
}

存储库接口(interface):

namespace ServiceStackServiceLog4NetTemplate.Interfaces.Repositories
{
public interface IPostBookRepository
{
Book PostBooks();
}
}

消息.请求

namespace ServiceStackServiceLog4NetTemplate.ServiceModel.Messages
{
[Route("/PostBooks", Verbs = "POST")]
public class PostBooksRequest
{
[AutoIncrement]
public int BookID { get; set; }
public string Author { get; set; }
public string Title { get; set; }
public int NumberOfPages { get; set; }
public int Isbn { get; set; }
}
}

消息.响应

namespace ServiceStackServiceLog4NetTemplate.ServiceModel.Messages
{
public class PostBooksResponse : IHasResponseStatus
{
public Book Book { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
}

经理

    class PostBooksManager : IPostBookManager
{
private IPostBookRepository postRepo;

public PostBooksManager(IPostBookRepository pRepo)
{
postRepo = pRepo;
}

public Book CreateBooks()
{
var bookCreations = postRepo.PostBooks();
return bookCreations;
}
}
}

存储库

namespace ServiceStackServiceLog4NetTemplate.Repositories
{
public class PostBookSqlRepo : IPostBookRepository
{
private readonly string connection = ConfigurationManager.AppSettings["BooksDB"];

public Book PostBooks()
{
var postBooks = CreateBooks();
return postBooks;
}

private Book CreateBooks()
{
var newBooks = new Book();
string query = "INSERT INTO dbo.BooksTable(BookID, Author, Title, NumberOfPages, ISBN)" +
"VALUES(@BookID, @Author, @Title, @NumberOfPages, @ISBN)";
SqlConnection dbConnect = new SqlConnection(connection);
SqlCommand cmd = new SqlCommand(query, dbConnect);


using (dbConnect)
{
dbConnect.Open();


var b = new Book()
{
BookID = newBooks.BookID,
Author = newBooks.Author,
Title = newBooks.Title,
NumberOfPages = newBooks.NumberOfPages,
Isbn = newBooks.Isbn
};

cmd.Parameters.AddWithValue("@BookID", b.BookID);
cmd.Parameters.AddWithValue("@Author", b.Author);
cmd.Parameters.AddWithValue("@Title", b.Title);
cmd.Parameters.AddWithValue("@NumberOfPages", b.NumberOfPages);
cmd.Parameters.AddWithValue("@ISBN", b.Isbn);


dbConnect.Close();
}

return newBooks;

}

}
}

服务定义

namespace ServiceStackServiceLog4NetTemplate.ServiceDefinition
{
[EnableCors(allowedMethods: "GET,POST,DELETE")]
class PostBooksServiceDefinition : Service
{
private IPostBookManager postManager;

public PostBooksServiceDefinition(IPostBookManager bookP)
{
postManager = bookP;
}

public object Post(PostBooksRequest request)
{
var postBook = request.ConvertTo<Book>();

PostBooksResponse resp = new PostBooksResponse()
{
Book = postBook
};

return resp;
}
}
}

最佳答案

首先,您的 Request DTO 上不应该有 [AutoIncrement],您正在将 DTO 转换为一个 Book 对象,这是您要保存的数据模型,而不是请求 DTO。 (它对任何东西都没有任何影响,它只是不必要的和未使用的)。

其次,您正在使用 OrmLite Book 数据模型中的数据属性,但您没有使用 OrmLite 插入记录。

要使用 OrmLite 在您的 ServiceStack 服务中插入新的 Book,您可以使用:

Db.Insert(postBook);

如果您还需要创建 Book RDBMS 表,如果它尚不存在,您可以创建它:

using (var db = dbFactory.Open())
{
db.CreateTableIfNotExists<Book>();
}

如果您还没有在 ServiceStack 中注册您的 OrmLiteConnectionFactory,您可以通过以下方式注册它:

container.Register<IDbConnectionFactory>(c => 
new OrmLiteConnectionFactory(connString, SqlServer2012Dialect.Provider));

有关更多信息,请参阅 OrmLite 项目页面上的文档:

使用存储库

如果你想使用 PostBookSqlRepo 来保存你的书,你应该用你的 IDbConnectionFactory 配置它,例如:

public class PostBookSqlRepo : IPostBookRepository
{
IDbConnectionFactory dbFactory;

public PostBookSqlRepo(IDbConnectionFactory dbFactory)
{
this.dbFactory = dbFactory;
}

//...

public Book CreateBooks(Book book)
{
using (var db = dbFactory.OpenDbConnection())
{
db.Insert(book);
}
}
}

您可以在 ServiceStack IOC 中配置:

container.Register<IPostBookRepository>(c =>
new PostBookSqlRepo(c.Resolve<IDbConnectionFactory>()));

关于c# - 使用 servicestack 和 c# 将数据发布到 sql server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471862/

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