ASP.Net核心 - 使用SQLite - 顯示但不保存實體框架的數據

asp.net asp.net-core entity-framework entity-framework-core sqlite

我試圖在ASP.Net Core中使用SQLiteEntityFramework Core

當我處於調試模式(使用Visual Studio)時,一切正常。

當我發布它,並且我正在嘗試接收數據時,它正在工作。

數據讀取控制器是這樣的 -

[HttpGet]
public async Task<IActionResult> Get(int start=0,int end=0)
{
    var bulletins = await _context.Bulletin
        .Include(u => u.Descriptions)
        .Include(u => u.Images)
        .ToArrayAsync();

    var response = bulletins.Select(u => new
    {
        Id = u.Id,
        UserId = u.UserId,
        Title = u.Title,
        Descriptions = u.Descriptions.Select(p => p.Text),
        Images = u.Images.Select(p => p.Name),
        BaseUrl = "localhost/uploads/"
    });

    return Ok(response);
}

但是當我試圖保存這樣的數據時 -

[HttpPost]
public IActionResult Insert(BulletinViewModel data, ICollection<IFormFile> image)
{
    List<Description> bulletinDescription = new List<Description>();

    foreach (var description in data.text)
    {
        bulletinDescription.Add(new Description{ Text = description });
    }

    //string filename1 = _environment.WebRootPath;

    List<Image> bulletinImages = new List<Image>();
    string path = Directory.GetCurrentDirectory();

    foreach (var file in image)
    {
        string fileName = Path.GetFileNameWithoutExtension(file.FileName);
        string extention = Path.GetExtension(file.FileName);

        var filename = ( data.user_id
                        + "_"
                        + Guid.NewGuid().ToString()
                        + "_"
                        + fileName
                        +extention).Trim('"');

        bulletinImages.Add(new Image { Name = filename });

        var serverFile = uploadDirectory + $@"/{filename}";
        //file.Length;
        using (FileStream fileStream = System.IO.File.Create(serverFile))
        {
            file.CopyTo(fileStream);
            fileStream.Flush();
        }
    }

    Bulletin bulletin = new Bulletin {
        UserId = data.user_id,
        Title = data.title,
        Descriptions = bulletinDescription,
        Images = bulletinImages
    };

    _context.Bulletin.Add(bulletin);
    _context.SaveChanges();

    return Ok(bulletin);
}

在調試模式(使用visual studio) 工作時不在生產中(發布後

我正在解決這個錯誤 (這裡給出了總日誌) -

   Hosting environment: Production
   Content root path: D:\Publish
   Now listening on: http://localhost:5000
   Application started. Press Ctrl+C to shut down.
   info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
         Request starting HTTP/1.1 GET http://localhost:5000/api/bulletin/get
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         PRAGMA foreign_keys=ON;
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         PRAGMA foreign_keys=ON;
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         SELECT COUNT(*) FROM "sqlite_master" WHERE "type" = 'table' AND "rootpage" IS NOT NULL;
   info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
         Executing action method BugTracker.api.BulletinController.Get (BugTracker) with arguments (0, 0) - ModelState is Valid
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         PRAGMA foreign_keys=ON;
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         SELECT "u"."Id", "u"."Title", "u"."UserId"
         FROM "Bulletin" AS "u"
         ORDER BY "u"."Id"
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         SELECT "i"."Id", "i"."BulletinId", "i"."Name"
         FROM "Image" AS "i"
         WHERE EXISTS (
             SELECT 1
             FROM "Bulletin" AS "u"
             WHERE "i"."BulletinId" = "u"."Id")
         ORDER BY "i"."BulletinId"
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         SELECT "d"."Id", "d"."BulletinId", "d"."Text"
         FROM "Description" AS "d"
         WHERE EXISTS (
             SELECT 1
             FROM "Bulletin" AS "u"
             WHERE "d"."BulletinId" = "u"."Id")
         ORDER BY "d"."BulletinId"
   info: Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[1]
         Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext.
   info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
         Executed action BugTracker.api.BulletinController.Get (BugTracker) in 4224.5672ms
   info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
         Request finished in 5902.4455ms 200 application/json; charset=utf-8
   info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
         Request starting HTTP/1.1 POST http://localhost:5000/api/bulletin/insert multipart/form-data; boundary=----WebKitFormBoundaryGALOJJbtKdvvVFah 2532310
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         PRAGMA foreign_keys=ON;
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         PRAGMA foreign_keys=ON;
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         SELECT COUNT(*) FROM "sqlite_master" WHERE "type" = 'table' AND "rootpage" IS NOT NULL;
   info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
         Executing action method BugTracker.api.BulletinController.Insert (BugTracker) with arguments (BugTracker.Model.ViewModels.BulletinViewModel, System.Collections.Generic.List`1[Microsoft.AspNetCore.Http.IFormFile]) - ModelState is Valid
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
         PRAGMA foreign_keys=ON;
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?'], CommandType='Text', CommandTimeout='30']
         INSERT INTO "Bulletin" ("Title", "UserId")
         VALUES (@p0, @p1);
         SELECT "Id"
         FROM "Bulletin"
         WHERE changes() = 1 AND "Id" = last_insert_rowid();
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[@p2='?', @p3='?'], CommandType='Text', CommandTimeout='30']
         INSERT INTO "Description" ("BulletinId", "Text")
         VALUES (@p2, @p3);
         SELECT "Id"
         FROM "Description"
         WHERE changes() = 1 AND "Id" = last_insert_rowid();
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[@p0='?', @p1='?'], CommandType='Text', CommandTimeout='30']
         INSERT INTO "Description" ("BulletinId", "Text")
         VALUES (@p0, @p1);
         SELECT "Id"
         FROM "Description"
         WHERE changes() = 1 AND "Id" = last_insert_rowid();
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[@p0='?', @p1='?'], CommandType='Text', CommandTimeout='30']
         INSERT INTO "Image" ("BulletinId", "Name")
         VALUES (@p0, @p1);
         SELECT "Id"
         FROM "Image"
         WHERE changes() = 1 AND "Id" = last_insert_rowid();
   info: Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory[1]
         Executed DbCommand (0ms) [Parameters=[@p0='?', @p1='?'], CommandType='Text', CommandTimeout='30']
         INSERT INTO "Image" ("BulletinId", "Name")
         VALUES (@p0, @p1);
         SELECT "Id"
         FROM "Image"
         WHERE changes() = 1 AND "Id" = last_insert_rowid();
   info: Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[1]
         Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext.
   fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0]
         An unhandled exception has occurred: Self referencing loop detected for property 'bulletin' with type 'BugTracker.DbModels.Mcp.Bulletin'. Path 'descriptions[0]'.
   Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'bulletin' with type 'BugTracker.DbModels.Mcp.Bulletin'. Path 'descriptions[0]'.
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
      at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
      at Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.WriteObject(TextWriter writer, Object value)
      at Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.<WriteResponseBodyAsync>d__9.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultAsync>d__32.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultFilterAsync>d__31.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAllResultFiltersAsync>d__29.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResourceFilterAsync>d__23.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__18.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.ApplicationInsights.AspNetCore.ExceptionTrackingMiddleware.<Invoke>d__4.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>d__6.MoveNext()
   warn: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0]
         The response has already started, the error handler will not be executed.
   fail: Microsoft.AspNetCore.Server.Kestrel[13]
         Connection id "0HKUCLKEV7G2Q": An unhandled exception was thrown by the application.
   Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'bulletin' with type 'BugTracker.DbModels.Mcp.Bulletin'. Path 'descriptions[0]'.
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
      at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
      at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
      at Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.WriteObject(TextWriter writer, Object value)
      at Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.<WriteResponseBodyAsync>d__9.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultAsync>d__32.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultFilterAsync>d__31.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAllResultFiltersAsync>d__29.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResourceFilterAsync>d__23.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__18.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.ApplicationInsights.AspNetCore.ExceptionTrackingMiddleware.<Invoke>d__4.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>d__6.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>d__6.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.ApplicationInsights.AspNetCore.RequestTrackingMiddleware.<Invoke>d__4.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.<Invoke>d__3.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext()
   --- End of stack trace from previous location where exception was thrown ---
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
      at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext()
   info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
         Request finished in 12477.1332ms 200 application/json; charset=utf-8

有人可以幫忙嗎?

在此先感謝您的幫助。

熱門答案

感謝Adem Caglin的懺悔

我這樣做了 -

services.AddMvc().AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling =  ReferenceLoopHandling.Ignore;
    });

一切都很好:)。

這里這裡可以找到更多。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow