2014-12-28 2 views
1

Я использую Asp.net mvc 5 и EF 6 для создания веб-приложения. Я начал с шаблоном интернет-приложений и добавлены такие классы:Entity Framework 6 Guid генерирует null?

public class Article 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid ID { get; set; } 
    public string Tags { get; set; } 
    public string Name { get; set; } 
    public string Link { get; set; } 
    public string HtmlContent { get; set; } 
    [ForeignKey("ListaId")] 
    public Lista Lista { get; set; } 
    public Guid ListaId { get; set; } 
} 

public class List 
{ 

    public string Name { get; set; } 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid ID { get; set; } 
    public int Status { get; set; } 
    public virtual ApplicationUser User { get; set; } 
    public string ApplicationUserId { get; set; } 
    public string Tags { get; set; } 
} 

Но каждый раз, когда NuGet менеджер пакетов обновляет БД и запускает метод Seed, он ломает при попытке вставить статью в БД. вот метод семян в configuration.cs

 context.Lists.AddOrUpdate(new Lista 
     { 
      Name = "Technology", 
      ApplicationUserId = "f06b0d2e-2088-4cd7-8b1c-4fcad5619f3c", 
      Status = 1, 
      Tags = "Tech,News" 
     }); 
     context.SaveChanges(); 

     Lista l1 = context.Lists.Where(x => x.Status == 1).First(); 

     context.Articles.AddOrUpdate(new Article 
     { 
      ListaId = l1.ID, 
      Link = "www.abc.com", 
      Name = "ABC", 
      Tags = "c,test", 
      HtmlContent = "Hello World" 
     }); 
     context.SaveChanges(); //here it breaks 

внутреннее исключение: System.Data.SqlClient.SqlException: Не удается вставить значение NULL в столбец 'ID', таблица «Сеть САШ-WebAPP-20141022011020.dbo. Статьи; столбец не допускает нулей. INSERT не работает Я получаю ту же ошибку, если я принимаю [Key] adnotation из класса Article, и если я использую adnotation [DatabaseGenerated (DatabaseGeneratedOption.Identity)], я получаю следующую ошибку: System.Data.SqlClient.SqlException: Нарушение ограничения PRIMARY KEY «PK_dbo.Articles». Невозможно вставить дубликат ключа в объект «dbo.Arts». Значение дублирующегося ключа: (00000000-0000-0000-0000-000000000000). С long/int в месте Guid я получаю ошибку update-database, например: uniqueidentifier несовместим с bigint/int.

Что я могу сделать? Почему он не генерирует правильный идентификатор с guid?

ответ

3

Вы должны сообщить базе данных, что вы хотите такого поведения. Обычно EF6 достаточно умен, если вы используете подход, основанный на кодах, он сможет генерировать правильное поведение.

Перейти к базе данных, изменить поле ID и добавить его в значение по умолчанию: newsequentialid().

Если вы хотите создать Guid самостоятельно:

public class Article 
{ 
    [Key] 
    public Guid ID { get; set; } 
    public string Tags { get; set; } 
    public string Name { get; set; } 
    public string Link { get; set; } 
    public string HtmlContent { get; set; } 
    [ForeignKey("ListaId")] 
    public Lista Lista { get; set; } 
    public Guid ListaId { get; set; } 

    public Article(){ 
     ID = Guid.NewGuid(); 
    } 

} 
+0

жаль ... добавить NEWSEQUENTIALID(), где? –

+0

@CristianDan; вы можете попробовать запустить этот SQL-запрос в своей базе данных: 'ALTER TABLE dbo.TableName ADD CONSTRAINT DF_ColumnName DEFAULT newsequentialid() FOR ColumnName', замените имена на столбец таблицы/идентификатора. –

+1

Большое спасибо .. он работает ... Я узнал, где написать newsequentialid(): D thanks –

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