Skip to content

Commit a574260

Browse files
authored
Merge pull request #5 from dfyx/model-builder-options
Add support for some ModelBuilder options
2 parents fb5e285 + 1791541 commit a574260

File tree

10 files changed

+58
-17
lines changed

10 files changed

+58
-17
lines changed

FileContextCore/FileContextCore.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<PackageReference Include="CsvHelper" Version="12.1.2" />
2727
<PackageReference Include="EPPlus.Core" Version="1.5.4" />
2828
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
29+
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
2930
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
3031
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
3132
<PackageReference Include="System.Xml.XmlSerializer" Version="4.3.0" />

FileContextCore/FileManager/DefaultFileManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.EntityFrameworkCore.Metadata;
22
using System;
33
using System.IO;
4+
using Microsoft.EntityFrameworkCore;
45

56
namespace FileContextCore.FileManager
67
{
@@ -21,7 +22,7 @@ public DefaultFileManager(IEntityType _type, string _filetype, string _databasen
2122

2223
public string GetFileName()
2324
{
24-
string name = type.Name.GetValidFileName();
25+
string name = type.Relational().TableName.GetValidFileName();
2526
string path = Path.Combine(AppContext.BaseDirectory, "appdata", databasename);
2627

2728
Directory.CreateDirectory(path);

FileContextCore/FileManager/EncryptedFileManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Security.Cryptography;
55
using System.Text;
6+
using Microsoft.EntityFrameworkCore;
67

78
namespace FileContextCore.FileManager
89
{
@@ -25,7 +26,7 @@ public EncryptedFileManager(IEntityType _type, string _filetype, string _key, st
2526

2627
public string GetFileName()
2728
{
28-
string name = type.Name;
29+
string name = type.Relational().TableName;
2930

3031
foreach(char c in Path.GetInvalidFileNameChars())
3132
{

FileContextCore/FileManager/PrivateFileManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Security.Cryptography;
55
using System.Text;
6+
using Microsoft.EntityFrameworkCore;
67

78
namespace FileContextCore.FileManager
89
{
@@ -23,7 +24,7 @@ public PrivateFileManager(IEntityType _type, string _filetype, string _databasen
2324

2425
public string GetFileName()
2526
{
26-
string name = type.Name.GetValidFileName();
27+
string name = type.Relational().TableName.GetValidFileName();
2728
string path = Path.Combine(AppContext.BaseDirectory, "appdata", databasename);
2829

2930
Directory.CreateDirectory(path);

FileContextCore/Serializer/BSONSerializer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO;
77
using System.Linq;
88
using System.Text;
9+
using Microsoft.EntityFrameworkCore;
910

1011
namespace FileContextCore.Serializer
1112
{
@@ -18,8 +19,8 @@ class BSONSerializer : ISerializer
1819
public BSONSerializer(IEntityType _entityType)
1920
{
2021
entityType = _entityType;
21-
propertyKeys = entityType.GetProperties().Select(p => p.Name).ToArray();
22-
typeList = entityType.GetProperties().Select(p => p.ClrType).ToArray();
22+
propertyKeys = entityType.GetProperties().Select(p => p.Relational().ColumnName).ToArray();
23+
typeList = entityType.GetProperties().Select(p => p.GetValueConverter()?.ProviderClrType ?? p.ClrType).ToArray();
2324
}
2425

2526
public Dictionary<TKey, object[]> Deserialize<TKey>(string list, Dictionary<TKey, object[]> newList)

FileContextCore/Serializer/CSVSerializer.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.IO;
66
using System.Linq;
77
using System.Text;
8+
using Microsoft.EntityFrameworkCore;
89

910
namespace FileContextCore.Serializer
1011
{
@@ -17,16 +18,22 @@ class CSVSerializer : ISerializer
1718
public CSVSerializer(IEntityType _entityType)
1819
{
1920
entityType = _entityType;
20-
propertyKeys = entityType.GetProperties().Select(p => p.Name).ToArray();
21-
typeList = entityType.GetProperties().Select(p => p.ClrType).ToArray();
21+
propertyKeys = entityType.GetProperties().Select(p => p.Relational().ColumnName).ToArray();
22+
typeList = entityType.GetProperties().Select(p => p.GetValueConverter()?.ProviderClrType ?? p.ClrType).ToArray();
2223
}
2324

2425
public Dictionary<TKey, object[]> Deserialize<TKey>(string list, Dictionary<TKey, object[]> newList)
2526
{
27+
if (string.IsNullOrEmpty(list))
28+
{
29+
return new Dictionary<TKey, object[]>();
30+
}
31+
2632
TextReader tr = new StringReader(list);
2733
CsvReader reader = new CsvReader(tr);
2834

2935
reader.Read();
36+
reader.ReadHeader();
3037

3138
while (reader.Read())
3239
{
@@ -35,7 +42,7 @@ public Dictionary<TKey, object[]> Deserialize<TKey>(string list, Dictionary<TKey
3542

3643
for (int i = 0; i < propertyKeys.Length; i++)
3744
{
38-
object val = reader.GetField(i + 1).Deserialize(typeList[i]);
45+
object val = reader.GetField(propertyKeys[i]).Deserialize(typeList[i]);
3946
value.Add(val);
4047
}
4148

FileContextCore/Serializer/EXCELSerializer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.IO;
66
using System.Linq;
77
using System.Text;
8+
using Microsoft.EntityFrameworkCore;
89

910
namespace FileContextCore.Serializer
1011
{
@@ -36,8 +37,8 @@ FileInfo GetFilePath()
3637
public EXCELSerializer(IEntityType _entityType, string _password, string databaseName)
3738
{
3839
entityType = _entityType;
39-
propertyKeys = entityType.GetProperties().Select(p => p.Name).ToArray();
40-
typeList = entityType.GetProperties().Select(p => p.ClrType).ToArray();
40+
propertyKeys = entityType.GetProperties().Select(p => p.Relational().ColumnName).ToArray();
41+
typeList = entityType.GetProperties().Select(p => p.GetValueConverter()?.ProviderClrType ?? p.ClrType).ToArray();
4142
password = _password;
4243
this.databaseName = databaseName;
4344

FileContextCore/Serializer/JSONSerializer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System;
44
using System.Collections.Generic;
55
using System.Linq;
6+
using Microsoft.EntityFrameworkCore;
67

78
namespace FileContextCore.Serializer
89
{
@@ -15,8 +16,8 @@ class JSONSerializer : ISerializer
1516
public JSONSerializer(IEntityType _entityType)
1617
{
1718
entityType = _entityType;
18-
propertyKeys = entityType.GetProperties().Select(p => p.Name).ToArray();
19-
typeList = entityType.GetProperties().Select(p => p.ClrType).ToArray();
19+
propertyKeys = entityType.GetProperties().Select(p => p.Relational().ColumnName).ToArray();
20+
typeList = entityType.GetProperties().Select(p => p.GetValueConverter()?.ProviderClrType ?? p.ClrType).ToArray();
2021
}
2122

2223
public Dictionary<TKey, object[]> Deserialize<TKey>(string list, Dictionary<TKey, object[]> newList)

FileContextCore/Serializer/XMLSerializer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Xml;
88
using System.Xml.Linq;
99
using System.Xml.Serialization;
10+
using Microsoft.EntityFrameworkCore;
1011

1112
namespace FileContextCore.Serializer
1213
{
@@ -19,8 +20,8 @@ class XMLSerializer : ISerializer
1920
public XMLSerializer(IEntityType _entityType)
2021
{
2122
entityType = _entityType;
22-
propertyKeys = entityType.GetProperties().Select(p => p.Name).ToArray();
23-
typeList = entityType.GetProperties().Select(p => p.ClrType).ToArray();
23+
propertyKeys = entityType.GetProperties().Select(p => p.Relational().ColumnName).ToArray();
24+
typeList = entityType.GetProperties().Select(p => p.GetValueConverter()?.ProviderClrType ?? p.ClrType).ToArray();
2425
}
2526

2627
public Dictionary<TKey, object[]> Deserialize<TKey>(string list, Dictionary<TKey, object[]> newList)

FileContextCore/Storage/Internal/FileContextTable.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.EntityFrameworkCore;
1616
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
1717
using Microsoft.EntityFrameworkCore.Metadata;
18+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
1819
using Microsoft.EntityFrameworkCore.Update;
1920

2021
namespace FileContextCore.Storage.Internal
@@ -185,7 +186,7 @@ private Dictionary<TKey, object[]> InitExcel(string filetype)
185186

186187
UpdateMethod = new Action<Dictionary<TKey, object[]>>((list) =>
187188
{
188-
excel.Serialize(list);
189+
excel.Serialize(ConvertToProvider(list));
189190
});
190191

191192
Dictionary<TKey, object[]> newlist = new Dictionary<TKey, object[]>(_keyValueFactory.EqualityComparer);
@@ -253,15 +254,40 @@ private Dictionary<TKey, object[]> Init()
253254

254255
UpdateMethod = new Action<Dictionary<TKey, object[]>>((list) =>
255256
{
256-
string cnt = serializer.Serialize(list);
257+
string cnt = serializer.Serialize(ConvertToProvider(list));
257258
fileManager.SaveContent(cnt);
258259
});
259260

260261
string content = fileManager.LoadContent();
261262
Dictionary<TKey, object[]> newList = new Dictionary<TKey, object[]>(_keyValueFactory.EqualityComparer);
262-
Dictionary<TKey, object[]> result = serializer.Deserialize(content, newList);
263+
Dictionary<TKey, object[]> result = ConvertFromProvider(serializer.Deserialize(content, newList));
263264
GenerateLastAutoPropertyValues(result);
264265
return result;
265266
}
267+
268+
private Dictionary<TKey, object[]> ApplyValueConverter(Dictionary<TKey, object[]> list, Func<ValueConverter, Func<object, object>> conversionFunc)
269+
{
270+
var result = new Dictionary<TKey, object[]>();
271+
var converters = entityType.GetProperties().Select(p => p.GetValueConverter()).ToArray();
272+
foreach (var keyValuePair in list)
273+
{
274+
result[keyValuePair.Key] = keyValuePair.Value.Select((value, index) =>
275+
{
276+
var converter = converters[index];
277+
return converter == null ? value : conversionFunc(converter)(value);
278+
}).ToArray();
279+
}
280+
return result;
281+
}
282+
283+
private Dictionary<TKey, object[]> ConvertToProvider(Dictionary<TKey, object[]> list)
284+
{
285+
return ApplyValueConverter(list, converter => converter.ConvertToProvider);
286+
}
287+
288+
private Dictionary<TKey, object[]> ConvertFromProvider(Dictionary<TKey, object[]> list)
289+
{
290+
return ApplyValueConverter(list, converter => converter.ConvertFromProvider);
291+
}
266292
}
267293
}

0 commit comments

Comments
 (0)