Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






База данных






Переходим к самому важному разделу, работе с БД. Например, у нас есть объект типа Post (блого-запись), которая, естественно, должна быть на двух языках:

ID Уникальный номер записи  
UserID Автор записи  
Header Заголовок Требует перевода
Url Url записи  
Content Содержимое записи Требует перевода
AddedDate Дата добавления  

 

Итак, как это всё будет организовано:

· Создадим таблицу Language, где и будут определены языки

· Создадим таблицу Post, где будут все поля, не требующие перевода

· Создадим таблицу PostLang, связанную с Post и Language, где будет перевод необходимых полей для таблицы Post и связанный с таблицей Language

Ок, теперь добавим это в LessonProject.Model (LessonProject.Model/IRepository.cs):

#region Language

 

IQueryable< Language> Languages { get; }

 

bool CreateLanguage(Language instance);

 

bool UpdateLanguage(Language instance);

 

bool RemoveLanguage(int idLanguage);

 

#endregion

 

#region Post

 

IQueryable< Post> Posts { get; }

 

bool CreatePost(Post instance);

 

bool UpdatePost(Post instance);

 

bool RemovePost(int idPost);

 

#endregion

Создаем модели с помощью уже созданных сниппетов /Proxy/Language.cs:

 

namespace LessonProject.Model

{

public partial class Language

{

}

}


 

/Proxy/Post.cs:

namespace LessonProject.Model

{

public partial class Post

{

}

}

 

/SqlRepository/Language.cs:

public partial class SqlRepository

{

public IQueryable< Language> Languages

{

get

{

return Db.Languages;

}

}

 

public bool CreateLanguage(Language instance)

{

if (instance.ID == 0)

{

Db.Languages.InsertOnSubmit(instance);

Db.Languages.Context.SubmitChanges();

return true;

}

 

return false;

}

 

public bool UpdateLanguage(Language instance)

{

Language cache = Db.Languages.Where(p => p.ID == instance.ID).FirstOrDefault();

if (cache! = null)

{

cache.Code = instance.Code;

cache.Name = instance.Name;

Db.Languages.Context.SubmitChanges();

return true;

}

 

return false;

}

 

public bool RemoveLanguage(int idLanguage)

{

Language instance = Db.Languages.Where(p => p.ID == idLanguage).FirstOrDefault();

if (instance! = null)

{

Db.Languages.DeleteOnSubmit(instance);

Db.Languages.Context.SubmitChanges();

return true;

}

 

return false;

}

 

}

/SqlRepository/Post.cs:

public partial class SqlRepository

{

public IQueryable< Post> Posts

{

get

{

return Db.Posts;

}

}

 

public bool CreatePost(Post instance)

{

if (instance.ID == 0)

{

Db.Posts.InsertOnSubmit(instance);

Db.Posts.Context.SubmitChanges();

return true;

}

 

return false;

}

 

public bool UpdatePost(Post instance)

{

Post cache = Db.Posts.Where(p => p.ID == instance.ID).FirstOrDefault();

if (cache! = null)

{

//TODO: Update fields for Post

Db.Posts.Context.SubmitChanges();

return true;

}

 

return false;

}

 

public bool RemovePost(int idPost)

{

Post instance = Db.Posts.Where(p => p.ID == idPost).FirstOrDefault();

if (instance! = null)

{

Db.Posts.DeleteOnSubmit(instance);

Db.Posts.Context.SubmitChanges();

return true;

}

 

return false;

}

 

}

Итак, у нас есть набор PostLangs в объекте класса Post, где и хранятся различные переводы. Причем, перевод на английский или русский язык может быть, так может и не быть. Но, по крайней мере, хотя бы один язык должен быть. Что необходимо сделать для этого:

· Добавим языковые поля в Post (Header, Content)

· Создадим свойство CurrentLang, при изменении которого будут инициализироваться языковые поля.

· При создании записи в БД Post автоматически создается запись в БД PostLang.

· При изменении записи в БД, проверяется, какой именно язык изменяется, и если такого языка (перевода) еще нет, то создается новая запись PostLang в БД:

Перейдем к реализации (/Proxy/Post.cs):

public partial class Post

{

private int _currentLang;

 

public int CurrentLang

{

get

{

return _currentLang;

}

 

set

{

_currentLang = value;

 

var currentLang = PostLangs.FirstOrDefault(p => p.LanguageID == value);

if (currentLang == null)

{

IsCorrectLang = false;

var anyLang = PostLangs.FirstOrDefault();

if (anyLang! = null)

{

SetLang(anyLang);

}

}

else

{

IsCorrectLang = true;

SetLang(currentLang);

}

}

}

 

private void SetLang(PostLang postLang)

{

Header = postLang.Header;

Content = postLang.Content;

}

 

public bool IsCorrectLang { get; protected set; }

 

public string Header { get; set; }

public string Content { get; set; }

}

Тут важно заметить, что если необходимого перевода нет, то берется первый попавшийся, и устанавливается IsCorrectLang = false. Это для того, что лучше показать пользователю хоть какую-то информацию, чем не показать ничего.

Создание/изменение объекта Post (/SqlRepository/Post.cs):

public bool CreatePost(Post instance)

{

if (instance.ID == 0)

{

instance.AddedDate = DateTime.Now;

Db.Posts.InsertOnSubmit(instance);

Db.Posts.Context.SubmitChanges();

var lang = Db.Languages.FirstOrDefault(p => p.ID == instance.CurrentLang);

if (lang! = null)

{

CreateOrChangePostLang(instance, null, lang);

return true;

}

}

 

return false;

}

 

public bool UpdatePost(Post instance)

{

Post cache = Db.Posts.Where(p => p.ID == instance.ID).FirstOrDefault();

if (cache! = null)

{

cache.Url = instance.Url;

Db.Posts.Context.SubmitChanges();

 

var lang = Db.Languages.FirstOrDefault(p => p.ID == instance.CurrentLang);

if (lang! = null)

{

CreateOrChangePostLang(instance, cache, lang);

return true;

}

return true;

}

 

return false;

}

 

private void CreateOrChangePostLang(Post instance, Post cache, Language lang)

{

PostLang postLang = null;

if (cache! = null)

{

postLang = Db.PostLangs.FirstOrDefault(p => p.PostID == cache.ID & & p.LanguageID == lang.ID);

}

if (postLang == null)

{

var newPostLang = new PostLang()

{

PostID = instance.ID,

LanguageID = lang.ID,

Header = instance.Header,

Content = instance.Content,

};

Db.PostLangs.InsertOnSubmit(newPostLang);

}

Else

{

postLang.Header = instance.Header;

postLang.Content = instance.Content;

}

Db.PostLangs.Context.SubmitChanges();

}

Рассмотрим, как работает CreateOrChangePostLang функция:

· При вызове данной функции, мы ищем в Language необходимый язык. Если язык не найден, то вызова не происходит, и мы не создаем PostLang объект (т.е. перевод)

· Если мы находим необходимый язык, то вызываем CreateOrChangePostLang:

o Если cache нулевое (объект PostLang еще точно не создан) или

o Если cache не нулевое, но перевод не найден, то

§ Создаем перевод (запись в БД PostLang)

o Иначе изменяем перевод, который найден.

При удалении записи Post все PostLang удаляются по связи OnDelete = cascade (проследите за этим)

В БД должны быть уже добавлены записи для необходимых языков:

  Ru Русский
  En English





© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.