2015-11-12 2 views
0

В настоящее время я храню данные своего приложения с использованием простого двоичного форматирования. Я хотел бы перейти от двоичного форматировщика для реализации SQL, по следующим причинам:Entity Framework: DataTable как XML-строка

  • Включить одновременное использование приложения на общий источнике данных
  • отходя от формата «собственного», который может (даже другие сборки)

Я внедряю код Entity Framework, чтобы сначала создать мою базу данных. Мой вопрос вращается вокруг хранения полей DataTable. У меня есть следующий объект:

public class Person 
{ 
    public string Name {get;set;} 
    public DataTable TableOfInformation {get;set;} 
} 

Сохранение строки «Имя» в колонке достаточно просто. Чтобы сохранить DataTable, я попытался преобразовать список списка данных. В настоящее время я склоняюсь к простому использованию сериализации XML и сохранению DataTable в качестве столбца строки.

Это лучший способ сохранить поле DataTable, и есть ли проблемы с этим подходом?

+0

DataTable действительно не предназначен для использования с EF. Просто десериализуйте свои данные в объект POCO, который будет намного легче работать с Code First. – CodeNotFound

+1

Вы должны сделать этот шаг дальше, а также сохранить DataTable в качестве таблицы базы данных. –

+0

Вы можете преобразовать DataTable в XML с помощью метода [DataTable.WriteXml] (https://msdn.microsoft.com/en-us/library/system.data.datatable.writexml%28v=vs.110%29.aspx). Однако это, во всяком случае, неправильный подход. –

ответ

0

Я бы не рекомендовал хранения DataTable как поле .. это имеет смысл, чтобы создать реальную таблицу вместо. При этом, если вы все еще хотите продолжить это, на самом деле это не так сложно. Вот пример:

public class Person 
{ 
    public string Name { get; set; } 

    public string TableOfInformationXml { get; set; } 

    [NotMapped] // <-- This is important, since you will only store the TableOfInformationXml field 
    public DataTable TableOfInformation 
    { 
     get 
     { 
      if (string.IsNullOrWhiteSpace(TableOfInformationXml)) 
      { 
       return new DataTable(); 
      } 
      var set = new DataSet(); 
      using (var reader = new StringReader(TableOfInformationXml)) 
      { 
       set.ReadXml(reader); 
      } 
      return set.Tables[0]; 
     } 
     set 
     { 
      var set = new DataSet(); 
      set.Tables.Add(value); 
      var sb = new StringBuilder(); 
      using (var stringWriter = new StringWriter(sb)) 
      { 
       set.WriteXml(stringWriter); 
      } 
      TableOfInformationXml = sb.ToString(); 
     } 
    } 
} 

И FYI: Вы могли бы также рассмотреть вопрос о хранении его как JSON вместо XML ... в этом случае, используйте следующее:

[NotMapped] 
public DataTable TableOfInformation 
{ 
    get 
    { 
     if (string.IsNullOrWhiteSpace(TableOfInformationJson)) 
     { 
      return new DataTable(); 
     } 
     return TableOfInformationJson.JsonDeserialize<DataTable>(); 
    } 
    set { TableOfInformationJson = value.ToJson(); } 
} 

Здесь у меня есть 2 метода расширения, как следует:

public static string ToJson<T>(this T item) 
{ 
    return JsonConvert.SerializeObject(item); 
} 

public static T JsonDeserialize<T>(this string json) 
{ 
    return JsonConvert.DeserializeObject<T>(json); 
} 
+0

Большое спасибо за это. Я понимаю, что это не идеально с точки зрения индексирования или обеспечения доступности всех данных в базе данных. Однако я не знаю простой и простой способ реализовать вместо этого фактическую таблицу. DataTable может быть любым размером (зависит от пользователя, и я не знаю заранее) и может изменять размер в приложении. Один класс также может иметь несколько таблиц, и я хотел бы иметь возможность легко управлять ими. Есть ли причина, по которой мне следует рассмотреть JSON (насколько она независима от платформы)? –

+0

@ User_FSharp1123, я не уверен, что вы имеете в виду относительно размера размера. Что касается JSON против XML, то на самом деле нет большой разницы, за исключением того, что JSON, безусловно, займет меньше места. Что касается производительности, я, честно говоря, не мог сказать, будет ли сериализация/десериализация JSON быстрее, чем при использовании XML. Вы можете найти некоторую информацию в Интернете об этом или сделать какое-то консольное тестовое приложение, чтобы исследовать его дальше. Кроме этого, я полагаю, это будет просто вопрос личного предпочтения. – Matt

+0

Итак, что я имею в виду по размеру размера, заключается в том, что я не вижу, как я могу следовать подходу, указанному Amadeus, так как для каждого столбца в DataTable ему потребуется свойство (строки, очевидно, не будут проблемой). Однако я не знаю, сколько столбцов будет (может быть 10, может быть 100, зависит от пользователя), поэтому я считаю, что решение, как вы здесь изложили, имеет больше смысла. Я очень хочу использовать XML-подход, так как кажется, что легко анализировать как .NET, так и в базе данных SQL. –

0

Вы можете создать модель, содержащую все поля в вашем DataTable.

public class PersonData 
{ 
    public string Address { get; set;} 
    public bool IsStackOverflowUser {get; set;} 
    public int Age {get; set;} 
} 

Затем вы можете добавить свойство PersonData к модели Person

public class Person 
{ 
    public string Name {get; set;} 
    public PersonData PersonalInformation {get; set;} 
} 
+0

Итак, хотя это была бы идеальная ситуация, я не знаю полей в DataTable. Они создаются динамически, так как это двумерная структура данных, содержащая удвоения, то есть может быть 10x4 или 20x6, или как бы там ни было. Размер может также изменяться для конкретного экземпляра класса Person (например, с 10x4 до 10x6). –

+0

Важно также отметить, что он не содержит только удвоений (иначе я бы использовал массив), но содержит комбинацию строк и значений double/int. Класс Person будет частью иерархии (например, Parent, GrandParent, Siblings), из которых каждый класс может содержать несколько таблиц данных не обязательно одного и того же размера. –

+0

Это похоже на случай для [ExpandoObjects] (https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject (v = vs.110) .aspx). Вы можете попытаться проанализировать все содержимое ячейки как строки, а затем использовать [Int32.TryParse] (https://msdn.microsoft.com/en-us/library/system.int32.tryparse (v = vs.110) .aspx) и [Double.TryParse] (https://msdn.microsoft.com /en-us/library/system.double.tryparse(v=vs.110).aspx) для анализа любых int или double, которые находятся в DataTable. –