C# EF Core |需要使用导航属性更新一个属性,而不是另一个(模块)
我有一个文件表,在其中我将FK添加到模块表中,以添加它来自哪个模块 当我们将记录创建到filesystemems中时,我们还需要更新filesystememsdatas 我们使用以下代码执行此操作:C# EF Core |需要使用导航属性更新一个属性,而不是另一个(模块),c#,entity-framework-core,ef-core-2.1,C#,Entity Framework Core,Ef Core 2.1,我有一个文件表,在其中我将FK添加到模块表中,以添加它来自哪个模块 当我们将记录创建到filesystemems中时,我们还需要更新filesystememsdatas 我们使用以下代码执行此操作: public async Task<int> CreateFileSystemItem(FileSystemItemCreateDTO fileSystemItem) { if (fileSystemItem == null)
public async Task<int> CreateFileSystemItem(FileSystemItemCreateDTO fileSystemItem)
{
if (fileSystemItem == null)
{
throw new ArgumentNullException(nameof(fileSystemItem));
}
var fileSystemItemToCreate = new FileSystemItems()
{
FileName = fileSystemItem.FileName,
FileType = fileSystemItem.FileType,
IsFolder = fileSystemItem.IsFolder,
LastWriteTime = fileSystemItem.LastWriteTime,
ParentId = fileSystemItem.ParentId,
FileMetadata = fileSystemItem.FileMetadata,
ModuleId = fileSystemItem.ModuleId,
};
fileSystemItemToCreate.FileSystemItemData.FileData = fileSystemItem.FileData;
BIContext.FileSystemItems.Add(fileSystemItemToCreate);
await SaveChangesAsync().ConfigureAwait(false);
return fileSystemItemToCreate.FileId;
}
公共异步任务CreateFileSystemItem(FileSystemEmCreatedToFileSystemItem)
{
if(filesystemem==null)
{
抛出新ArgumentNullException(nameof(fileSystemItem));
}
var filesystememtocreate=new filesystememitems()
{
FileName=filesystemem.FileName,
FileType=filesystememitem.FileType,
IsFolder=filesystememitem.IsFolder,
LastWriteTime=fileSystemItem.LastWriteTime,
ParentId=filesystememitem.ParentId,
FileMetadata=fileSystemItem.FileMetadata,
ModuleId=filesystememitem.ModuleId,
};
FileSystemToCreate.FileSystemEmData.FileData=FileSystemEmItem.FileData;
添加(fileSystemToCreate);
等待SaveChangesSync()。配置等待(false);
返回filesystemtocreate.FileId;
}
然后我看到了这个错误:
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'DisplayName', table 'Core.Modules'; column does not allow nulls. INSERT fails.
The statement has been terminated.
at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__180_0(Task`1 result)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参见内部异常。-->System.Data.SqlClient.SqlException:无法将值NULL插入到“DisplayName”列、表“Core.Modules”中;列不允许空值。插入失败。
声明已终止。
在System.Data.SqlClient.SqlCommand.c.b\u 180\u 0(任务'1结果)
位于System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
在System.Threading.Tasks.Task.Execute()中
---来自引发异常的上一个位置的堆栈结束跟踪---
我知道我是通过我的导航属性添加到FileSystemItemData中的,但是如何确保我不更新.Modules导航属性,因为在这种情况下我不需要更新
filesystemems.cs
/// <summary>
/// File System Item
/// </summary>
public partial class FileSystemItems
{
/// <summary>
/// Initializes a new instance of the <see cref="FileSystemItems"/> class.
/// </summary>
public FileSystemItems()
{
ItemChildren = new HashSet<FileSystemItems>();
FileSystemItemData = new FileSystemItemDatas();
Module = new Modules();
}
/// <summary>
/// Gets or sets the file identifier.
/// </summary>
/// <value>
/// The file identifier.
/// </value>
public int FileId { get; set; }
/// <summary>
/// Gets or sets the parent identifier.
/// </summary>
/// <value>
/// The parent identifier.
/// </value>
public int? ParentId { get; set; }
/// <summary>
/// Gets or sets the name of the file.
/// </summary>
/// <value>
/// The name of the file.
/// </value>
public string FileName { get; set; }
/// <summary>
/// Gets or sets the type of the file.
/// </summary>
/// <value>
/// The type of the file.
/// </value>
public string FileType { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is folder.
/// </summary>
/// <value>
/// <c>true</c> if this instance is folder; otherwise, <c>false</c>.
/// </value>
public bool IsFolder { get; set; }
/// <summary>
/// Gets or sets the last write time.
/// </summary>
/// <value>
/// The last write time.
/// </value>
public DateTime LastWriteTime { get; set; }
/// <summary>
/// Gets or sets the file system item data identifier.
/// </summary>
/// <value>
/// The file system item data identifier.
/// </value>
public int? FileSystemItemDataId { get; set; }
/// <summary>
/// Gets or sets the module identifier.
/// </summary>
/// <value>
/// The module identifier.
/// </value>
public int? ModuleId { get; set; }
/// <summary>
/// Gets or sets the file metadata.
/// </summary>
/// <value>
/// The file metadata.
/// </value>
public string FileMetadata { get; set; }
/// <summary>
/// Gets or sets the file system item data.
/// </summary>
/// <value>
/// The file system item data.
/// </value>
public FileSystemItemDatas FileSystemItemData { get; set; }
/// <summary>
/// Gets or sets the item children.
/// </summary>
/// <value>
/// The item children.
/// </value>
public virtual ICollection<FileSystemItems> ItemChildren { get; set; }
/// <summary>
/// Gets or sets the parent item.
/// </summary>
/// <value>
/// The parent item.
/// </value>
public virtual FileSystemItems ParentItem { get; set; }
/// <summary>
/// Gets or sets the module.
/// </summary>
/// <value>
/// The module.
/// </value>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1716:Identifiers should not match keywords", Justification = "It's a Module")]
public virtual Modules Module { get; set; }
}
//
///文件系统项
///
公共部分类文件系统
{
///
///初始化类的新实例。
///
公共文件系统emitems()
{
ItemChildren=newhashset();
filesystememdata=newfilesystememdatas();
模块=新模块();
}
///
///获取或设置文件标识符。
///
///
///文件标识符。
///
public int FileId{get;set;}
///
///获取或设置父标识符。
///
///
///父标识符。
///
public int?ParentId{get;set;}
///
///获取或设置文件的名称。
///
///
///文件名。
///
公共字符串文件名{get;set;}
///
///获取或设置文件的类型。
///
///
///文件的类型。
///
公共字符串文件类型{get;set;}
///
///获取或设置一个值,该值指示此实例是否为文件夹。
///
///
///如果此实例是文件夹,则为true;否则为false。
///
公用文件夹{get;set;}
///
///获取或设置上次写入时间。
///
///
///最后一次写入时间。
///
公共日期时间LastWriteTime{get;set;}
///
///获取或设置文件系统项数据标识符。
///
///
///文件系统项数据标识符。
///
公共int?FileSystemDataId{get;set;}
///
///获取或设置模块标识符。
///
///
///模块标识符。
///
公共int?ModuleId{get;set;}
///
///获取或设置文件元数据。
///
///
///文件元数据。
///
公共字符串FileMetadata{get;set;}
///
///获取或设置文件系统项数据。
///
///
///文件系统项数据。
///
公共filesystemdatas filesystememdata{get;set;}
///
///获取或设置项的子项。
///
///
///该项目包含多个子项。
///
公共虚拟ICollection ItemChildren{get;set;}
///
///获取或设置父项。
///
///
///父项。
///
公共虚拟文件系统父项{get;set;}
///
///获取或设置模块。
///
///
///模块。
///
[System.Diagnostics.CodeAnalysis.SuppressMessage(“命名”,“CA1716:标识符不应与关键字匹配”,Justification=“这是一个模块”)]
公共虚拟模块模块{get;set;}
}
模块.cs
/// <summary>
/// Module
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1716:Identifiers should not match keywords", Justification = "It's a Module")]
[Table("Modules", Schema = "Core")]
public partial class Modules
{
/// <summary>
/// Gets or sets the module identifier.
/// </summary>
/// <value>
/// The module identifier.
/// </value>
public int ModuleId { get; set; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>
/// The name.
/// </value>
public string Name { get; set; }
/// <summary>
/// Gets or sets the display name.
/// </summary>
/// <value>
/// The name.
/// </value>
public string DisplayName { get; set; }
/// <summary>
/// Gets or sets the extension identifier.
/// </summary>
/// <value>
/// The extension identifier.
/// </value>
public int ExtensionId { get; set; }
/// <summary>
/// Gets or sets the file system items.
/// </summary>
/// <value>
/// The file system items.
/// </value>
public virtual ICollection<FileSystemItems> FileSystemItems { get; set; }
}
//
///模块
///
[System.Diagnostics.CodeAnalysis.SuppressMessage(“命名”,“CA1716:标识符不应与关键字匹配”,Justification=“这是一个模块”)]
[表(“模块”,Schema=“核心”)]
公共部分类模块
{
///
///获取或设置模块标识符。
///
///
///模块标识符。
///
public int ModuleId{get;set;}
///
///获取或设置名称。
///
///
///名字。
///
公共字符串名称{get;set;}
///
///获取或设置显示名称。
///
///
///名字。
///
公共字符串DisplayName{get;set;}
///
/// <summary>
/// File system item data
/// </summary>
public partial class FileSystemItemDatas
{
/// <summary>
/// Initializes a new instance of the <see cref="FileSystemItemDatas"/> class.
/// </summary>
public FileSystemItemDatas()
{
FileSystemItems = new HashSet<FileSystemItems>();
}
/// <summary>
/// Gets or sets the file data identifier.
/// </summary>
/// <value>
/// The file data identifier.
/// </value>
public int FileDataId { get; set; }
#pragma warning disable CA1819 // Properties should not return arrays
/// <summary>
/// Gets or sets the file data.
/// </summary>
/// <value>
/// The file data.
/// </value>
public byte[] FileData { get; set; }
#pragma warning restore CA1819 // Properties should not return arrays
/// <summary>
/// Gets or sets the file system items.
/// </summary>
/// <value>
/// The file system items.
/// </value>
public ICollection<FileSystemItems> FileSystemItems { get; set; }
}
modelBuilder.Entity<FileSystemItemDatas>(entity =>
{
entity.HasKey(e => e.FileDataId);
});
modelBuilder.Entity<FileSystemItems>(entity =>
{
entity.HasKey(e => e.FileId);
entity.Property(e => e.FileName)
.IsRequired()
.HasMaxLength(255)
.IsUnicode(false);
entity.Property(e => e.FileType)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.FileMetadata).IsRequired().HasColumnType("nvarchar(max)").HasDefaultValue("[{}]");
entity.Property(e => e.LastWriteTime).HasColumnType("datetime");
entity.HasOne(d => d.FileSystemItemData)
.WithMany(p => p.FileSystemItems)
.HasForeignKey(d => d.FileSystemItemDataId)
.HasConstraintName("FK_FileSystemItems_FileSystemItemDatas");
entity.HasOne(d => d.Module)
.WithMany(p => p.FileSystemItems)
.HasForeignKey(d => d.ModuleId)
.HasConstraintName("FK_FileSystemItems_ModuleId");
entity.HasOne(d => d.ParentItem)
.WithMany(p => p.ItemChildren)
.HasForeignKey(d => d.ParentId)
.HasConstraintName("FK_FileSystemItems_FileSystemItems");
entity.HasOne(d => d.ParentItem)
.WithMany(p => p.ItemChildren)
.HasForeignKey(d => d.ParentId)
.HasConstraintName("FK_FileSystemItems_FileSystemItems");
});
modelBuilder.Entity<Modules>(entity =>
{
entity.HasKey(e => e.ModuleId);
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(200)
.IsUnicode(false);
entity.Property(e => e.DisplayName)
.IsRequired()
.HasMaxLength(200)
.IsUnicode(false);
});
/// <summary>
/// Initializes a new instance of the <see cref="FileSystemItems"/> class.
/// </summary>
public FileSystemItems()
{
ItemChildren = new HashSet<FileSystemItems>();
}