Eu escrevi essa classe:
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"
};
}
}
e
internal class DataContext : DbContext
{
public DbSet<Test> Tests { get; set; }
}
Depois de executar o código:
var db = new DataContext();
db.Tests.Add(new Test());
db.SaveChanges();
meus dados estão sendo salvos, mas apenas o Id
. Não tenho tabelas nem relacionamentos aplicáveis à lista de Strings .
O que estou fazendo de errado? Também tentei fazer Strings, virtual
mas não mudou nada.
Obrigado pela ajuda.
c#
.net
entity-framework
Paulo
fonte
fonte
Test
entidade. Portanto, crie uma nova entidade comId
propriedade eMyString
propriedade e , em seguida, faça uma lista disso.Respostas:
O Entity Framework não oferece suporte a coleções de tipos primitivos. Você pode criar uma entidade (que será salva em uma tabela diferente) ou fazer algum processamento de string para salvar sua lista como uma string e preencher a lista após a entidade ser materializada.
fonte
EF Core 2.1+:
Propriedade:
OnModelCreating:
fonte
Esta resposta é baseada nas fornecidas por @Sasan e @CAD bloke .
Funciona apenas com EF Core 2.1+ (não compatível com .NET Standard) (Newtonsoft
JsonConvert
)Usando a configuração fluente EF Core, serializamos / desserializamos o
List
de / para JSON.Por que este código é a combinação perfeita de tudo pelo que você pode se esforçar:
fonte
var result = await context.MyTable.Where(x => x.Strings.Contains("findme")).ToListAsync();
não encontra nada.Eu sei que esta é uma pergunta antiga, e Pawel deu a resposta correta , eu só queria mostrar um exemplo de código de como fazer algum processamento de string e evitar uma classe extra para a lista de um tipo primitivo.
fonte
,
(vírgula) em strings. Se uma string na lista contém uma ou mais,
(vírgula), a string é dividida em várias strings.string.Join
vírgula deve ser colocado entre aspas duplas (para uma string), não aspas simples (para um caractere). Consulte msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspxJSON.NET para o resgate.
Você o serializa em JSON para persistir no banco de dados e desserializa para reconstituir a coleção .NET. Parece ter um desempenho melhor do que eu esperava com o Entity Framework 6 e o SQLite. Eu sei que você pediu,
List<string>
mas aqui está um exemplo de uma coleção ainda mais complexa que funciona muito bem.Eu marquei a propriedade persistida com,
[Obsolete]
portanto, seria muito óbvio para mim que "esta não é a propriedade que você está procurando" no curso normal da codificação. A propriedade "real" é marcada com,[NotMapped]
portanto, a estrutura Entity a ignora.(tangente não relacionada): Você poderia fazer o mesmo com tipos mais complexos, mas precisa se perguntar se acabou de tornar a consulta das propriedades daquele objeto muito difícil para você? (sim, no meu caso).
fonte
Só para simplificar -
A estrutura da entidade não oferece suporte a primitivos. Você pode criar uma classe para envolvê-la ou adicionar outra propriedade para formatar a lista como uma string:
fonte
Claro que Pawel deu a resposta certa . Mas descobri neste post que desde o EF 6+ é possível salvar propriedades privadas. Então, eu preferiria esse código, porque você não consegue salvar as Strings de maneira errada.
fonte
StringsAsStrings
só será atualizado quando aStrings
referência for alterada, e a única vez em seu exemplo que acontece é na atribuição. Adicionar ou remover itens de suaStrings
lista após a atribuição não atualizará aStringsAsStrings
variável de apoio. A maneira adequada de implementar isso seria exporStringsAsStrings
como uma visualização daStrings
lista, em vez do contrário. Junte os valores noget
acessador daStringsAsStrings
propriedade e divida-os noset
acessador.Ligeiramente ajustes @Mathieu Viales 's resposta , aqui está um trecho compatível .NET padrão usando o novo serializador System.Text.Json eliminando assim a dependência de Newtonsoft.Json.
Observe que, embora o segundo argumento em ambos
Serialize()
eDeserialize()
seja normalmente opcional, você receberá um erro:Definir explicitamente como o padrão (nulo) para cada esclarece isso.
fonte
Você pode usar este
ScalarCollection
contêiner que confina uma matriz e fornece algumas opções de manipulação ( Gist ):Uso:
Código:
fonte
NET462
pelo ambiente apropriado ou adicioná-lo a ele.