我以前從來沒有做過這樣的事情,我正在努力尋找我的問題的任何答案(也不知道要問什么問題會讓它變得更加困難)。
我有一個 .NET Core 6 Web API,它連接到一個 SQL Express DB(我使用的是 EF 和 AutoMapper)。
我有一個模型
public partial class ConcessionDocument
{
public long Id { get; set; }
public long RequestId { get; set; }
public int LineNumber { get; set; }
public IFormFile ConcessionDoc { get; set; } = null!;
public virtual RequestLine RequestLine { get; set; } = null!;
}
還有我的資料庫背景關系
modelBuilder.Entity<ConcessionDocument>(entity =>
{
entity.HasKey(e => new { e.RequestId, e.LineNumber })
.HasName("PK_RMR_CONCESSIONDOCUMENT");
entity.ToTable("ConcessionDocument", "rmr");
entity.Property(e => e.Id);
entity.Property(e => e.ConcessionDoc);
entity.HasOne(d => d.RequestLine)
.WithOne(p => p.ConcessionDocument)
.HasForeignKey<RequestLine>(d => new { d.RequestId, d.LineNumber })
.HasConstraintName("FK_RMR_REQUESTLINE_CONCESSIONDOCUMENT");
});
和我的資料庫表
CREATE TABLE [rmr].[ConcessionDocument]
(
[Id] BIGINT NOT NULL IDENTITY(1,1),
[RequestId] BIGINT NOT NULL,
[LineNumber] INT NOT NULL,
[ConcessionDoc] VARBINARY(MAX) NOT NULL
CONSTRAINT PK_RMR_CONCESSIONDOCUMENT
--PRIMARY KEY ([RequestId], [LineNumber]),
PRIMARY KEY ([Id])
CONSTRAINT FK_RMR_REQUESTLINE_CONCESSIONDOCUMENT
FOREIGN KEY (RequestId, LineNumber)
REFERENCES rmr.RequestLine(RequestId, LineNumber),
)
現在我正在我的控制器中處理 POST 方法。我已經為此使用了 AutoMapper,我需要做的其他一切都很好,我已經理解并能夠讓它作業。我現在需要能夠上傳小檔案,這就是我苦苦掙扎的地方。我的理解是 <2mb 的檔案可以進入資料庫,這是我想要采取的方法,因為不會有很多。
從我目前閱讀的內容來看,我需要將 IFormFile ConcessionDoc 屬性轉換為 Memory Stream,以便能夠將其作為 varbinary 保存在我的資料庫中。
[HttpPost]
public async Task<ActionResult<ConcessionDocumentCreateDTO>> PostConcessionDoc(ConcessionDocumentCreateDTO concessionDocDto)
{
var conDoc = _mapper.Map<ConcessionDocument>(concessionDocDto);
Byte[]? bytes = null;
if (_context.ConcessionDocument == null)
{
return Problem("Entity set 'RawcliffeDatastoreContext.ConcessionDocument' is null.");
}
await _context.ConcessionDocument.AddAsync(conDoc);
try
{
using (MemoryStream ms = new MemoryStream())
{
if(conDoc.ConcessionDoc != null)
{
conDoc.ConcessionDoc.OpenReadStream().CopyTo(ms);
}
bytes = ms.ToArray();
}
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (ConcessionDocExists(conDoc.Id))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtAction(nameof(GetConcessionDoc), new { id = conDoc.Id }, conDoc);
}
以上是我到目前為止所擁有的 - 這與我的其他控制器遵循相同的格式,并添加了設定記憶體流(作為位元組變數)。
我不知道從這里去哪里。
我相信我需要以某種方式覆寫 AutoMapper 正在做的事情,將位元組映射到 ConcessionDoc 屬性。
有人知道我會怎么做嗎?另外,如果這完全不正確,我會走錯路等,請告訴我。歡迎任何和所有的建議。
uj5u.com熱心網友回復:
到目前為止你做得很好,你只需要做一些調整。
IFormFile是一個介面,所以你真的不希望它在一個 EF 物體上,因此因為它是一個 varbinary,你應該把它作為一個byte[].
我相信我需要以某種方式覆寫 AutoMapper 正在做的事情,將位元組映射到 ConcessionDoc 屬性。
是的,您可以conDoc在執行_mapper.Map.
而不是做bytes = ms.ToArray();,你可以做conDoc.ConcessionDoc = ms.ToArray();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511417.html
