2

У меня есть сайт MVC с использованием коды первых миграций, который содержит объект под названием «Организация», как показано ниже:Установка значений по умолчанию для сложных свойств - Засыпка базы данных

public class Organisation 
{ 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public virtual ICollection<Contact> Contacts { get; set; } 
    public virtual ICollection<Location> Locations { get; set; } 
    public UserPermissions Permissions { get; set; } 

} 

И я пытаюсь реализовать права доступа пользователей для каждого из области на моем сайте. В результате Права доступа свойство было недавно добавленный выше и является объектом UserPermissions типа:

public class UserPermissions 
{ 
    public PermissionLevel Contacts { get; set; } 
    public PermissionLevel Messages { get; set; } 
    public PermissionLevel Groups { get; set; } 
    public PermissionLevel Data { get; set; } 
} 

Где PermissionLevels это перечисление определяется как:

public enum PermissionLevel 
{ 
    Locked = 0, 
    View = 1, 
    Administrator = 2 
} 

Я чувствую структуру эта реализация прекрасна и при добавлении миграции EF создает столбец в моей таблице dbo.Organisations для каждого типа разрешений (Permissions_Contacts, Permissions_Messages и т. д.).

В базе данных, однако, уже есть много организаций, и я задавался вопросом, был ли способ введения значения по умолчанию. Если я обновляю свою базу данных, теперь все разрешения будут 0 (заблокировано), однако я бы хотел, чтобы значение по умолчанию было разным для каждой категории разрешений, например. Права администратора для контактов/сообщений/групп и заблокированные права для данных, поскольку данные будут настроены как и когда пользователь запросит его.

Я скоро добавлю функциональность к уровню администрирования сайта, на котором созданы организации, и сделайте выбор UserPermissions обязательным для всех областей, но я бы предпочел не возвращаться и вручную изменять все разрешения существующих организаций - мои дефолты.

Есть ли способ автоматического наложения этих значений по умолчанию для существующих организаций в базе данных?

+1

Вы пробовали использовать это https://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute%28v=vs.110%29.aspx, я не знаю, будет ли это работать, хотя – George

+0

Спасибо, что я никогда не видел эту собственность. Я попробую добавить тег [DefaultValue (typeof (PermissionLevels), PermissionLevels.Administrator)] 'к свойствам и посмотреть, будет ли он принудительно применяться к уже существующим в таблице. Я предполагаю, что после этого вы получите и настроите работу? – JonnyKnottsvill

+0

Все должно быть хорошо, как я сказал в своем первом комментарии, я не знаю, будет ли он редактировать текущий db для этих значений. – George

ответ

1

Не могли бы вы установить разрешения по умолчанию в конструкторе вашего объекта Organisation или UserPermissions?

Что-то вроде:

public UserPermissions() 
{ 
    Contacts = PermissionLevel.Locked; 
    // etc 
} 

или

public Organisation() 
{ 
    this.Permissions = new UserPermissions(); 

    if (this.Id == 0) // new object not yet persisted 
    { 
     this.Permissions.Contacts = PermissionLevel.Locked; 
     // etc 
    } 
} 

На основе комментариев:

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

В основном в вашем скрипте вверх вы можете либо писать обновления SQL-операторов, либо перебирать объекты через контекст, чтобы манипулировать их значениями в более строго типизированном виде.

Вот некоторая информация о начале работы с миграционными сценариев:

http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application

Я думаю, что ваш Up метод может быть изменен, чтобы иметь что-то вроде этого ближе к концу:

using (MyContext context = new MyContext) 
{ 
    var orgs = context.Organisation; 
    foreach (Organization org in orgs) 
    { 
     org.Permissions = new UserPermissions() 
     { 
      Contacts = PermissionLevel.Locked, 
      // etc 
     } 
    } 

    context.SaveChanges(); 
} 
+0

Это будет работать для добавления новых организаций, которые являются хорошими, но я больше стараюсь не редактировать права доступа этих организаций уже в моей базе данных .... потому что в настоящее время у них нет разрешений, я просто добавил их и при обновлении базы данных их разрешения будут считаться нулевыми, и все будет сделано 0 (заблокировано). – JonnyKnottsvill

+0

Итак, ваш вопрос конкретно в том, как вернуть данные, а не как навязать дефолт в будущем? Какую модель EF вы используете? сначала код? db в первую очередь? модель первая? Я думаю, что это может повлиять на то, какой тип решения будет использоваться для предварительной заполнения ваших существующих данных. – Kritner

+0

Извините, что я отредактирую, чтобы сделать ситуацию более ясной. Я использую первые миграции кода. – JonnyKnottsvill

Смежные вопросы