Я написал такой класс:
class Test
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public List<String> Strings { get; set; }
public Test()
{
Strings = new List<string>
{
"test",
"test2",
"test3",
"test4"
};
}
}
и
internal class DataContext : DbContext
{
public DbSet<Test> Tests { get; set; }
}
После запуска кода:
var db = new DataContext();
db.Tests.Add(new Test());
db.SaveChanges();
мои данные сохраняются, но только файлы Id
. У меня нет таблиц или отношений, применимых к списку строк .
Что я делаю не так? Я также пробовал делать струны, virtual
но это ничего не меняло.
Спасибо за помощь.
c#
.net
entity-framework
Павел
источник
источник
Test
сущность. Итак, создайте новую сущность соId
свойством иMyString
свойством, а затем составьте их список.Ответы:
Entity Framework не поддерживает коллекции примитивных типов. Вы можете создать объект (который будет сохранен в другой таблице) или выполнить некоторую строковую обработку, чтобы сохранить список как строку и заполнить список после того, как объект будет материализован.
источник
EF Core 2.1+:
Свойство:
OnModelCreating:
источник
Этот ответ основан на ответах @Sasan и @CAD bloke .
Работает только с EF Core 2.1+ (несовместимо с .NET Standard) (Newtonsoft
JsonConvert
)Используя свободную конфигурацию EF Core, мы сериализуем / десериализуем
List
JSON в / из.Почему этот код - идеальное сочетание всего, к чему вы могли стремиться:
источник
var result = await context.MyTable.Where(x => x.Strings.Contains("findme")).ToListAsync();
ничего не находит.Я знаю, что это старый вопрос, и Павел дал правильный ответ , я просто хотел показать пример кода, как выполнить некоторую обработку строк, и избежать дополнительного класса для списка примитивного типа.
источник
,
запятую в строках. Если строка в списке содержит одну или несколько,
(запятых), строка разбивается на несколько строк.string.Join
запятой должны быть заключены в двойные кавычки (для строки), а не одиночные кавычки (для полукокса). См. Msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspxJSON.NET приходит на помощь.
Вы сериализуете его в JSON, чтобы он сохранялся в базе данных, и десериализуете его, чтобы восстановить коллекцию .NET. Похоже, это работает лучше, чем я ожидал, с Entity Framework 6 и SQLite. Я знаю, что вы просили,
List<string>
но вот пример еще более сложной коллекции, которая отлично работает.Я пометил постоянное свойство тегом,
[Obsolete]
чтобы мне было очень очевидно, что «это не то свойство, которое вы ищете» в обычном процессе кодирования. «Настоящее» свойство помечено,[NotMapped]
поэтому платформа Entity игнорирует его.(несвязанный касательный): вы можете сделать то же самое с более сложными типами, но вам нужно спросить себя, не слишком ли усложнили для себя запросы свойств этого объекта? (да, в моем случае).
источник
Чтобы упростить -
Платформа Entity Framework не поддерживает примитивы. Вы либо создаете класс, чтобы обернуть его, либо добавить другое свойство для форматирования списка в виде строки:
источник
Конечно, Павел дал правильный ответ . Но в этом посте я обнаружил, что, начиная с EF 6+, можно сохранять частные свойства. Поэтому я бы предпочел этот код, потому что вы не можете сохранить строки неправильно.
источник
StringsAsStrings
будет обновляться только при измененииStrings
ссылки , и в вашем примере это происходит только при назначении. Добавление или удаление элементов из вашегоStrings
списка после назначения не приводит к обновлениюStringsAsStrings
поддерживающей переменной. Правильный способ реализовать это - открытьStringsAsStrings
в видеStrings
списка, а не наоборот. Соедините значения вместе вget
методе доступаStringsAsStrings
свойства и разделите их вset
методе доступа.Слегка щипая @Mathieu Viales «S ответ , вот совместимый сниппет .NET Standard с использованием нового System.Text.Json сериалайзер , таким образом устраняя зависимость от Newtonsoft.Json.
Обратите внимание, что хотя второй аргумент в обоих
Serialize()
иDeserialize()
обычно является необязательным, вы получите сообщение об ошибке:Явная установка этого значения по умолчанию (null) для каждого очищает это.
источник
Вы можете использовать этот
ScalarCollection
контейнер, который ограничивает массив и предоставляет некоторые параметры манипуляции ( Gist ):Использование:
Код:
источник
NET462
соответствующую среду или добавили ее.