Saya menulis kelas seperti itu:
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"
};
}
}
dan
internal class DataContext : DbContext
{
public DbSet<Test> Tests { get; set; }
}
Setelah menjalankan kode:
var db = new DataContext();
db.Tests.Add(new Test());
db.SaveChanges();
data saya disimpan tetapi hanya file Id
. Saya tidak memiliki tabel atau hubungan apa pun yang berlaku untuk daftar String .
Apa yang saya lakukan salah? Saya juga mencoba membuat Strings virtual
tetapi tidak mengubah apa pun.
Terima kasih untuk bantuannya.
c#
.net
entity-framework
Paul
sumber
sumber
Test
entitas Anda . Jadi buatlah entitas baru denganId
property danMyString
property, lalu buat daftarnya.Jawaban:
Kerangka Kerja Entitas tidak mendukung kumpulan tipe primitif. Anda dapat membuat entitas (yang akan disimpan ke tabel yang berbeda) atau melakukan beberapa pemrosesan string untuk menyimpan daftar Anda sebagai string dan mengisi daftar setelah entitas terwujud.
sumber
EF Core 2.1+:
Properti:
OnModelCreating:
sumber
Jawaban ini berdasarkan yang diberikan oleh @Sasan dan @CAD bloke .
Hanya bekerja dengan EF Core 2.1+ (tidak kompatibel .NET Standard) (Newtonsoft
JsonConvert
)Dengan menggunakan konfigurasi fasih EF Core, kami membuat serial / deserialisasi
List
ke / dari JSON.Mengapa kode ini adalah perpaduan sempurna dari semua yang dapat Anda perjuangkan:
sumber
var result = await context.MyTable.Where(x => x.Strings.Contains("findme")).ToListAsync();
tidak menemukan apa pun.Saya tahu ini adalah pertanyaan lama, dan Pawel telah memberikan jawaban yang benar , saya hanya ingin menunjukkan contoh kode cara melakukan pemrosesan string, dan menghindari kelas tambahan untuk daftar tipe primitif.
sumber
,
(koma) dalam string. Jika sebuah string dalam daftar berisi satu atau lebih,
(koma) string tersebut dipecah menjadi beberapa string.string.Join
koma harus diapit oleh tanda kutip ganda (untuk string), bukan tanda kutip tunggal (untuk karakter). Lihat msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspxJSON.NET untuk menyelamatkan.
Anda membuat serial ke JSON untuk bertahan dalam Database dan Deserialisasi untuk menyusun kembali koleksi .NET. Ini tampaknya berkinerja lebih baik dari yang saya harapkan dengan Entity Framework 6 & SQLite. Saya tahu Anda memintanya,
List<string>
tetapi berikut adalah contoh koleksi yang bahkan lebih kompleks yang berfungsi dengan baik.Saya menandai properti yang dipertahankan dengan
[Obsolete]
sehingga akan sangat jelas bagi saya bahwa "ini bukan properti yang Anda cari" dalam proses pengkodean normal. Properti "nyata" diberi tag[NotMapped]
sehingga kerangka Entitas mengabaikannya.(tangen tidak terkait): Anda dapat melakukan hal yang sama dengan tipe yang lebih kompleks tetapi Anda perlu bertanya pada diri sendiri apakah Anda hanya membuat kueri properti objek itu terlalu sulit untuk diri Anda sendiri? (ya, dalam kasus saya).
sumber
Hanya untuk menyederhanakan -
Kerangka entitas tidak mendukung primitif. Anda bisa membuat kelas untuk membungkusnya atau menambahkan properti lain untuk memformat daftar sebagai string:
sumber
Tentu Pawel sudah memberikan jawaban yang benar . Tetapi saya menemukan dalam posting ini bahwa sejak EF 6+ dimungkinkan untuk menyimpan properti pribadi. Jadi saya lebih suka kode ini, karena Anda tidak dapat menyimpan String dengan cara yang salah.
sumber
StringsAsStrings
hanya akan diperbarui ketikaStrings
referensi diubah, dan satu-satunya waktu dalam contoh Anda yang terjadi adalah saat penugasan. Menambahkan atau menghapus item dariStrings
daftar Anda setelah tugas tidak akan memperbaruiStringsAsStrings
variabel dukungan. Cara yang tepat untuk mengimplementasikan ini adalah dengan mengeksposStringsAsStrings
sebagai tampilanStrings
daftar, bukan sebaliknya. Gabungkan nilai-nilai tersebut di dalamget
pengaksesStringsAsStrings
properti, dan pisahkan diset
pengakses.Sedikit tweaker @Mathieu Viales 's jawaban , di sini adalah potongan NET Standard kompatibel menggunakan serializer System.Text.Json baru sehingga menghilangkan ketergantungan pada Newtonsoft.Json.
Perhatikan bahwa sementara argumen kedua di keduanya
Serialize()
danDeserialize()
biasanya opsional, Anda akan mendapatkan kesalahan:Secara eksplisit mengaturnya ke default (null) untuk setiap membersihkannya.
sumber
Anda dapat menggunakan
ScalarCollection
container ini yang membatasi array dan menyediakan beberapa opsi manipulasi ( Gist ):Pemakaian:
Kode:
sumber
NET462
dengan lingkungan yang sesuai atau menambahkannya ke dalamnya.