«Свойство" List <nnn> '"PPP' не может быть отображена ..." Ошибка при попытке заселить модель с помощью отношений в рамкC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 «Свойство" List <nnn> '"PPP' не может быть отображена ..." Ошибка при попытке заселить модель с помощью отношений в рамк

Сообщение Anonymous »

Entity: < /p>

Код: Выделить всё

using CommonSolution.Entities.Task;
using Microsoft.EntityFrameworkCore;

namespace EntityFramework.Models;

[System.ComponentModel.DataAnnotations.Schema.Table("tasks_custom_folders")]
[Microsoft.EntityFrameworkCore.EntityTypeConfiguration(typeof(TaskCustomFolderModel.Configuration))]
public class TaskCustomFolderModel
{

/* [ Theory ] `Guid.NewGuid()` return the string of 36 characters. See https://stackoverflow.com/a/4458925/4818123 */
[System.ComponentModel.DataAnnotations.Key]
[System.ComponentModel.DataAnnotations.MaxLength(36)]
public string ID { get; set; } = Guid.NewGuid().ToString();

/* ━━━ Title ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
[System.ComponentModel.DataAnnotations.MaxLength(TaskCustomFolder.Title.MAXIMAL_CHARACTERS_COUNT)]
public string Title { get; set; } = null!;

/* ━━━ Relatives ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
/* ─── Parent ───────────────────────────────────────────────────────────────────────────────────────────────────── */
/* [ Theory ] Although generally the explicit specifying of navigation property is optional, it is required for seeding. */
/* [ Theory ] `Guid.NewGuid()` return the string of 36 characters. See https://stackoverflow.com/a/4458925/4818123 */
[System.ComponentModel.DataAnnotations.MaxLength(36)]
public string? ParentID { get; set; }

public TaskCustomFolderModel? Parent { get; set; }

/* ─── Children ─────────────────────────────────────────────────────────────────────────────────────────────────── */
public List Children { get; set; } = [];

/* ━━━ Order Among Siblings ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
public uint OrderAmongSiblings { get; set; }

/* ━━━ Configuration ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
public class Configuration : Microsoft.EntityFrameworkCore.IEntityTypeConfiguration
{

private const string TABLE_NAME = "TasksCustomFolders";

public void Configure(
Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder builder)
{

builder.ToTable(Configuration.TABLE_NAME);

builder.
Property(taskCustomFolderModel => taskCustomFolderModel.Title).
IsRequired(TaskCustomFolder.Title.IS_REQUIRED);

builder.
Property(taskCustomFolderModel => taskCustomFolderModel.Parent).
IsRequired(TaskCustomFolder.Parent.IS_REQUIRED);

builder.
Property(taskCustomFolderModel => taskCustomFolderModel.ParentID).
IsRequired(TaskCustomFolder.Parent.IS_REQUIRED);

builder.
Property(taskCustomFolderModel => taskCustomFolderModel.Children).
IsRequired(TaskCustomFolder.Children.IS_REQUIRED);

builder.
Property(taskCustomFolderModel => taskCustomFolderModel.OrderAmongSiblings).
IsRequired(TaskCustomFolder.OrderAmongSiblings.IS_REQUIRED);
}
}
}
< /code>
Ошибка, когда я пытаюсь заселить базу данных, вызывая base.database.ensurecreated (); < /code>: < /p>

Рассмотрите возможность преобразования значения свойства в тип, поддерживаемый базой данных с использованием преобразователя значений. См. Https://aka.ms/efcore-docs-value-converters для получения дополнительной информации. С альтернативы, исключите свойство из модели, используя атрибут '[notmapped]' или с помощью 'entitytypebuilder.ignore' in 'onmodelcreating'.  '< /P>
< /blockquote>
в соответствии с Ошибка, поставщик базы данных не поддерживает что-то, однако ниже пример, который я использовал для ссылки и который также имеет отношения хорошо!public class MenuItem
{
public int Id { get; set; }
public string? Title { get; set; }
public int? ParentId { get; set; }
public MenuItem? Parent { get; set; }
public List Children { get; set; } = new();
}

using Microsoft.EntityFrameworkCore;

public class ApplicationContext : DbContext
{
public DbSet MenuItems { get; set; } = null!;

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=helloapp.db");
}
}

using (ApplicationContext db = new ApplicationContext())
{
db.Database.EnsureDeleted();
db.Database.EnsureCreated();

MenuItem file = new MenuItem { Title = "File" };
MenuItem edit = new MenuItem { Title = "Edit" };
MenuItem open = new MenuItem { Title = "Open", Parent = file };
MenuItem save = new MenuItem { Title = "Save", Parent = file };

MenuItem copy = new MenuItem { Title = "Copy", Parent = edit };
MenuItem paste = new MenuItem { Title = "Paste", Parent = edit };

db.MenuItems.AddRange(file, edit, open, save, copy, paste);
db.SaveChanges();
}

using (ApplicationContext db = new ApplicationContext())
{
var menuItems = db.MenuItems.ToList();
Console.WriteLine("All Menu:");

foreach (MenuItem m in menuItems)
{
Console.WriteLine(m.Title);
}

Console.WriteLine();

var fileMenu = db.MenuItems.FirstOrDefault(m => m.Title == "File");

if (fileMenu != null)
{
Console.WriteLine(fileMenu.Title);

foreach (var m in fileMenu.Children)
{
Console.WriteLine($"---{m.Title}");
}
}
}
< /code>
Так что это выглядит как проблема в чем -то другом, поэтому пока я не скажу, какой поставщик DB я использую. < /p>
Классы контекста базы данных с код посева: < /p>
public class RemoteDatabaseContext : DatabaseContext
{
public RemoteDatabaseContext()
{
// base.Database.EnsureDeleted();
base.Database.EnsureCreated();
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);

optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Username=postgres;Password=pass1234");
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.
Entity().
HasData(TaskCustomFolderModel.FromBusinessRulesEntities(SampleTasksCustomFoldersRepository.TaskCustomFolders));
}
}

public abstract class DatabaseContext : Microsoft.EntityFrameworkCore.DbContext
{
public DbSet TasksModels { get; internal set; } = null!;
public DbSet TaskCustomFoldersModels { get; internal set; } = null!;
public DbSet LocationModels { get; internal set; } = null!;

public DbSet PeopleModels { get; internal set; } = null!;
}
Почему вы устанавливаете Isrequired через Fluent API, в то время как максимальные символы считаются атрибутами? потому что TaskCustomFolderModel и другие модели структуры объектов должны измениться из -за изменений в бизнес -правилах без ручного кода, пока это возможно. > Согласно чистой архитектуре, бизнес -правила не должны зависеть от каких -либо структур, в то время как зависит от TaskCustomFolderModel . Таким образом, помимо класса TaskCustomFolderModel есть тот, который из бизнес-правил:

Код: Выделить всё

public class TaskCustomFolder
{
public required string ID { get; init; }

/* ━━━ Title ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
public required string title { get; set; }

public abstract record Title
{
public const bool IS_REQUIRED = true;
public const byte MINIMAL_CHARACTERS_COUNT = 1;
public const byte MAXIMAL_CHARACTERS_COUNT = Byte.MaxValue;
}

/* ━━━ Relatives ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
/* ─── Parent ───────────────────────────────────────────────────────────────────────────────────────────────────── */
public TaskCustomFolder? parent { get; set; }

public abstract record Parent
{
public const bool IS_REQUIRED = false;
}

/* ─── Children ─────────────────────────────────────────────────────────────────────────────────────────────────── */
public List children { get; set; } = [];

public abstract record Children
{
public const bool IS_REQUIRED = false;
}

/* ━━━ Order Among Siblings ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
public required uint orderAmongSiblings { get; set; }

public abstract record OrderAmongSiblings
{
public const bool IS_REQUIRED = true;
public const uint MINIMAL_VALUE = 1;
public const uint MAXIMAL_VALUE = UInt32.MaxValue;
}

/* ━━━ Path ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
public string path
{
get
{
TaskCustomFolder currentDepthLevel = this;
List pathSegments = [ currentDepthLevel.title ];

while (currentDepthLevel.parent is not null)
{
currentDepthLevel = currentDepthLevel.parent;
pathSegments.Add(currentDepthLevel.title);
}

return String.Join("/", pathSegments);
}
}
}
Если мы изменим maximal_characters_count какого -либо свойства, не нужно редактировать TaskCustomFolderModel , потому что он относится к бизнес -правилам с помощью атрибута:
br />

Код: Выделить всё

public class TaskCustomFolderModel
{
// ...   [System.ComponentModel.DataAnnotations.MaxLength(TaskCustomFolder.Title.MAXIMAL_CHARACTERS_COUNT)]
public string Title { get; set; } = null!;
}
Однако нет необходимого атрибута , который принимает параметр, подобный TaskCustomFolder.children.is_required . Так что это может быть сделано только через Fluent API (или создание нового атрибута).


Подробнее здесь: https://stackoverflow.com/questions/791 ... ng-to-seed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»