C# 如何使用EntityFramework将作为字符串列表的JSON对象作为字段之一存储到SQL中
因此,我看到了以下JSON:C# 如何使用EntityFramework将作为字符串列表的JSON对象作为字段之一存储到SQL中,c#,json.net,C#,Json.net,因此,我看到了以下JSON: [ { "Title": "TOY STORY 4", "GENRE": "COMEDY", "Actors": [ "Tom Hanks", "Tim Allen", "Annie Potts&
[
{
"Title": "TOY STORY 4",
"GENRE": "COMEDY",
"Actors": [
"Tom Hanks",
"Tim Allen",
"Annie Potts"
],
"Id": 1
},
{
"Title": "The Matrix",
"GENRE": "Action",
"Actors": [
"Keanu Reeves",
"Laurence Fishburne",
"Carrie-Anne Moss"
],
"Id": 2
}
]
C# object
class Movies
{
public string Title {get; set;}
public string GENRE {get; set;}
public string[] Actors {get; set;}
public int id {get; set;}
}
当我为电影创建控制器时,它没有演员列,也没有为演员创建新表
电影控制器
public class MoviesController : ApiController
{
private DataContext db = new DataContext();
// GET: api/Movies
public IQueryable<Movies> GetMovies()
{
return db.Movies;
}
// GET: api/Movies/5
[ResponseType(typeof(Movies))]
public IHttpActionResult GetMovies(int id)
{
Movies movies = db.Movies.Find(id);
if (movies == null)
{
return NotFound();
}
return Ok(movies);
}
// PUT: api/Movies/5
[ResponseType(typeof(void))]
public IHttpActionResult PutMovies(int id, Movies movies)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != movies.id)
{
return BadRequest();
}
db.Entry(movies).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!MoviesExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
// POST: api/Movies
[ResponseType(typeof(Movies))]
public IHttpActionResult PostMovies(Movies movies)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Movies.Add(movies);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = movies.id }, movies);
}
// DELETE: api/Movies/5
[ResponseType(typeof(Movies))]
public IHttpActionResult DeleteMovies(int id)
{
Movies movies = db.Movies.Find(id);
if (movies == null)
{
return NotFound();
}
db.Movies.Remove(movies);
db.SaveChanges();
return Ok(movies);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool MoviesExists(int id)
{
return db.Movies.Count(e => e.id == id) > 0;
}
}
公共类电影控制器:ApiController
{
私有DataContext db=新DataContext();
//获取:api/电影
公共IQueryable GetMovies()
{
返回db.Movies;
}
//获取:api/Movies/5
[响应类型(电影类型))]
公共IHttpActionResult GetMovies(int id)
{
Movies Movies=db.Movies.Find(id);
如果(电影==null)
{
返回NotFound();
}
返回Ok(电影);
}
//PUT:api/Movies/5
[响应类型(typeof(void))]
公共IHttpActionResult PutMovies(int id,Movies)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
if(id!=movies.id)
{
返回请求();
}
db.Entry(movies).State=EntityState.Modified;
尝试
{
db.SaveChanges();
}
catch(DbUpdateConcurrencyException)
{
如果(!MoviesExists(id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回状态码(HttpStatusCode.NoContent);
}
//帖子:api/电影
[响应类型(电影类型))]
公共IHttpActionResult PostMovies(电影)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
db.Movies.Add(电影);
db.SaveChanges();
返回CreatedAtRoute(“DefaultApi”,新的{id=movies.id},movies);
}
//删除:api/Movies/5
[响应类型(电影类型))]
公共IHttpActionResult DeleteMovies(内部id)
{
Movies Movies=db.Movies.Find(id);
如果(电影==null)
{
返回NotFound();
}
db.Movies.Remove(电影);
db.SaveChanges();
返回Ok(电影);
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
私有bool MoviesExists(int-id)
{
返回db.Movies.Count(e=>e.id==id)>0;
}
}
这是我将演员作为对象制作的另一个场景:
public class Movies1
{
public string Title { get; set; }
public string GENRE { get; set; }
public List<Actor> Actors { get; set; }
public int id { get; set; }
}
public class Actor
{
public string Actors { get; set; }
public int Id { get; set; }
}
公共类电影1
{
公共字符串标题{get;set;}
公共字符串类型{get;set;}
public List如果我理解正确,并且您只想将Actors
作为原始json字符串存储在Db中,那么您可以向DbContextOnModelCreating
方法添加值转换器,如下所示:
using System.Text.Json;
public class MyDbContext : DbContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder
.Entity<Movies>()
.Property(m => m.Actors)
.HasConversion(
a => JsonSerializer.Serialize(a),
a => JsonSerializer.Deserialize<string[]>(a));
}
}
共享您的控制器方法?…控制器不能有用于参与者的列…该语句没有意义。控制器不为模型创建表。您需要使用EntityFramework并创建表。您只能将数据存储到控制器方法中的该列中…可能是因为参与者
是一个strin数组gs.你需要它是一个Actor
对象数组。但是你的问题让人困惑,因为你说controller没有列,controller不应该有列。你好,谢谢你的回答,所以我使用EntityFramework,很抱歉让人困惑…我想做的是获取json并将其链接到对象和store转换为SQL。我尝试将Actors字段更改为仅包含字符串但实体仍不捕获actor的对象……我想做的是将字符串转换为逗号分隔符字符串并将其保存为单个字符串。似乎有两种方法可以处理此问题。创建“actor”对象并创建一个多对多关系,或者将参与者视为逗号分隔的字符串。最终,这里的选择取决于您希望如何实现您的设计以及它在未来将做什么。我个人只会选择创建另一个实体。
using System.Text.Json;
public class MyDbContext : DbContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder
.Entity<Movies>()
.Property(m => m.Actors)
.HasConversion(
a => JsonSerializer.Serialize(a),
a => JsonSerializer.Deserialize<string[]>(a));
}
}
using Newtonsoft.Json;
...
// Everything else remains the same.
.HasConversion(
a => JsonConvert.SerializeObject(a),
a => JsonConvert.DeserializeObject<string[]>(a));