asp.net MVC 4 - C# 将模型对象作为 BLOB 插入和检索到/来回数据库

本文关键字:检索 插入 BLOB 数据库 MVC net 对象 模型 asp | 更新日期: 2023-09-27 17:57:09

无论我问到关于C#的问题,我都只得到图像和文件的答案。我想将一个对象作为 BLOB(而不是图像)从一个 asp.net 应用程序存储到数据库中,并从另一个应用程序检索它。

假设我有一个模型Person

public class Person
{
    public int userID { set; get; }
    public string userName { get; set; }
    public string lastName { get; set; }
    public string firstName { get; set; }
    public string email { get; set; }
    public List<int> someAttr { get; set; }
    public List<int> otherAttr { get; set; }
    public List<SomeModel> modelAttr { get; set; }
    public List<AnotherModel> modelAttr2 { get; set; }
}

该模型不仅具有常规的数据类型值,而且具有一些List(数组)以及其他特定模型类型数据(SomeModelAnotherModel)。出于这个原因,我需要将此模型的对象存储到数据库中并从另一个应用程序中检索它,因为会话变量在不同 asp.net 应用程序之间来回导航时会丢失。

现在我的目标是:

Person p1 = *Retrieve data from database, and store it to p1*

我正在尝试将 p1 存储在数据库中,其所有值都完好无损,以便当我从我的第二个 asp.net mvc 应用程序中检索它时,我可以像 p1.userNamep1.email 一样使用它,然后是循环中的列表,如下所示:

for(int i=0; i<p1.someAttr.Count(); i++)
{
     *use i.someAttr[i] in some way*
}

我找到了各种资源来做到这一点,但使用图像文件。它们与我的情况不匹配,所以我发布了这个问题。

http://www.c-sharpcorner.com/uploadfile/Ashush/working-with-binary-large-objects-blobs/http://www.aspsnippets.com/Articles/Read-and-Write-BLOB-Data-to-SQL-Server-database-using-C-and-VBNet.aspx

谢谢。

asp.net MVC 4 - C# 将模型对象作为 BLOB 插入和检索到/来回数据库

可以使用此 PersonRepository 类来实现此目的,该类将使用 JSON 中的序列化版本将对象存储在 SQL 数据库中。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
namespace StackOverflow
{
    #region Models
    public class Person
    {
        public int userID { set; get; }
        public string userName { get; set; }
        public string lastName { get; set; }
        public string firstName { get; set; }
        public string email { get; set; }
        public List<int> someAttr { get; set; }
        public List<int> otherAttr { get; set; }
        public List<SomeModel> modelAttr { get; set; }
        public List<AnotherModel> modelAttr2 { get; set; }
    }
    public class SomeModel
    {
        public int SomeProperty { get; set; }
    }
    public class AnotherModel
    {
        public string AnotherProperty { get; set; }
    }
    #endregion
    public class PersonRepository
    {
        // Before you can use this repository you need to setup a Person table to store your objects
        // CREATE TABLE Person (UserID int primary key, PersonObject text)
        private string _dbConnectionString;
        public PersonRepository(string dbConnectionString)
        {
            this._dbConnectionString = dbConnectionString;
        }
        public void WriteToDatabase(Person p)
        {
            using (var conn = new SqlConnection(_dbConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    // Serialize the person object to JSON to store in the database
                    var personJson = JsonConvert.SerializeObject(p);
                    command.CommandText = "INSERT INTO Person (UserID, PersonObject) values (@UserId, @PersonObject)";
                    command.Parameters.Add(new SqlParameter("@UserID", p.userID));
                    command.Parameters.Add(new SqlParameter("@PersonObject", personJson));
                    // Execute the SQL command to insert the record
                    command.ExecuteNonQuery();
                }
            }
        }
        public Person ReadFromDatabase(int userId)
        {
            using (var conn = new SqlConnection(_dbConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT PersonObject from Person where UserID = @UserID";
                    command.Parameters.AddWithValue("@UserID", userId);
                    using (var reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            // Read out the JSON respresentation of the Person object
                            var personJson = reader.GetString(0);
                            // Deserialize it back into a Person object. Note you will have to deal with versioning issues.
                            return JsonConvert.DeserializeObject<Person>(personJson);
                        }
                        else
                            throw new ApplicationException($"No person found with user ID {userId}");
                    }
                }
            }
        }
    }
}

对于简短的回答,您可以将它们保存为 Json 或 Xml 格式,甚至可以以二进制 Json/Xml 序列化,但处理 CRUD 操作并不简单。

BLOB是一种存储在数据库中的二进制数据类型,如图像/音频,目前,它们作为文件流保存在MS SQL Server中。

像List someAttr,List modelAttr这样的数据被视为集合,可以通过其外键访问(不能被视为Blob)在实体框架中,您可以使用"包含"检索它们,例如:

var modelAttr = MyEntitiy.Person.Include(r=>r.modelAttr)

在OData中,您可以通过"扩展"关键字获得因此,在 CRUD 操作中,可以使用许多 ORM 框架、OData 和 Rest 服务轻松处理将集合保存在单独的实体中。