Pau*_*aul 82 .net c# entity-framework
我写了这样的课:
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"
};
}
}
Run Code Online (Sandbox Code Playgroud)
和
internal class DataContext : DbContext
{
public DbSet<Test> Tests { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
运行代码后:
var db = new DataContext();
db.Tests.Add(new Test());
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我的数据正在保存但只是保存Id.我没有任何表格,也没有适用于字符串列表的关系.
我究竟做错了什么?我也尝试制作字符串, virtual但它没有改变任何东西.
谢谢您的帮助.
Sas*_*san 49
EF Core 2.1+:
属性:
public string[] Strings { get; set; }
Run Code Online (Sandbox Code Playgroud)
OnModelCreating:
modelBuilder.Entity<YourEntity>()
.Property(e => e.Strings)
.HasConversion(
v => string.Join(',', v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
Run Code Online (Sandbox Code Playgroud)
ran*_*oms 41
我知道这是一个老问题,Pawel给出了正确答案,我只想展示一个如何进行字符串处理的代码示例,并避免为基本类型列表添加额外的类.
public class Test
{
public Test()
{
_strings = new List<string>
{
"test",
"test2",
"test3",
"test4"
};
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
private List<String> _strings { get; set; }
public List<string> Strings
{
get { return _strings; }
set { _strings = value; }
}
[Required]
public string StringsAsString
{
get { return String.Join(',', _strings); }
set { _strings = value.Split(',').ToList(); }
}
}
Run Code Online (Sandbox Code Playgroud)
CAD*_*oke 26
您将其序列化为JSON以在数据库中持久化并对其进行反序列化以重构.NET集合.这似乎比我预期的Entity Framework 6和SQLite表现更好.我知道你要求,List<string>但这里有一个更复杂的收藏品的例子.
我标记了持久性属性,[Obsolete]因此在正常的编码过程中对我来说非常明显"这不是你正在寻找的属性"."真实"属性被标记为,[NotMapped]因此实体框架忽略它.
(不相关的切线):你可以用更复杂的类型做同样的事情,但你需要问自己,你是否只是为自己查询对象的属性太难了?(是的,在我的情况下).
using Newtonsoft.Json;
....
[NotMapped]
public Dictionary<string, string> MetaData { get; set; } = new Dictionary<string, string>();
/// <summary> <see cref="MetaData"/> for database persistence. </summary>
[Obsolete("Only for Persistence by EntityFramework")]
public string MetaDataJsonForDb
{
get
{
return MetaData == null || !MetaData.Any()
? null
: JsonConvert.SerializeObject(MetaData);
}
set
{
if (string.IsNullOrWhiteSpace(value))
MetaData.Clear();
else
MetaData = JsonConvert.DeserializeObject<Dictionary<string, string>>(value);
}
}
Run Code Online (Sandbox Code Playgroud)
Xan*_*iff 21
稍微调整@Mathieu Viales的答案,这是一个使用新 System.Text.Json 序列化程序的 .NET Standard 兼容片段,从而消除了对 Newtonsoft.Json 的依赖。
using System.Text.Json;
builder.Entity<YourEntity>().Property(p => p.Strings)
.HasConversion(
v => JsonSerializer.Serialize(v, default),
v => JsonSerializer.Deserialize<List<string>>(v, default));
Run Code Online (Sandbox Code Playgroud)
请注意,虽然Serialize()and 中的第二个参数Deserialize()通常是可选的,但您会收到错误消息:
表达式树不能包含使用可选参数的调用或调用
将其显式设置为默认值(空)会清除它。
Mat*_*LES 16
该答案基于@Sasan和@CAD bloke提供的答案。
JsonConvert)builder.Entity<YourEntity>().Property(p => p.Strings)
.HasConversion(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<List<string>>(v));
Run Code Online (Sandbox Code Playgroud)
使用EF Core流畅配置,我们List可以对JSON进行序列化/反序列化。
为什么此代码是您可以争取的一切的完美结合:
Ada*_*Tal 11
只是为了简化 -
实体框架不支持原语.您可以创建一个类来包装它,也可以添加另一个属性来将列表格式化为字符串:
public ICollection<string> List { get; set; }
public string ListString
{
get { return string.Join(",", List); }
set { List = value.Split(',').ToList(); }
}
Run Code Online (Sandbox Code Playgroud)
小智 7
当然Pawel给出了正确的答案.但我在这篇文章中发现,自EF 6+以来,它可以保存私人财产.所以我更喜欢这段代码,因为你无法以错误的方式保存字符串.
public class Test
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column]
[Required]
private String StringsAsStrings { get; set; }
public List<String> Strings
{
get { return StringsAsStrings.Split(',').ToList(); }
set
{
StringsAsStrings = String.Join(",", value);
}
}
public Test()
{
Strings = new List<string>
{
"test",
"test2",
"test3",
"test4"
};
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
文档中的示例:
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Contents { get; set; }
public ICollection<string> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用 System.Text.Json:
modelBuilder.Entity<Post>()
.Property(e => e.Tags)
.HasConversion(
v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
v => JsonSerializer.Deserialize<List<string>>(v, (JsonSerializerOptions)null),
new ValueComparer<ICollection<string>>(
(c1, c2) => c1.SequenceEqual(c2),
c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
c => (ICollection<string>)c.ToList()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70152 次 |
| 最近记录: |