2014-02-10 7 views
1

Я получаю сообщение об ошибке при выполнении базы данных обновлений: «Имена столбцов в каждой таблице должны быть уникальными. Имя столбца« OrderRecieveDate »в таблице« dbo.OrderForms »указано больше чем единожды." Я пробовал все, что мог придумать, чтобы исправить это, и пока ничего не вышло. Раньше я мог добавлять/обновлять/удалять строки из своей таблицы через созданный мной сайт, но теперь эта функция даже не работает. Я даже не могу получить базу данных для добавления моих данных семян на данный момент.Ошибка: имена столбцов в каждой таблице должны быть уникальными

Мой Контекст/Модель файл:

public class OrderFormContext : DbContext 
{ 
    public DbSet<OrderForm> OrderForms { get; set; } 
} 

public class OrderForm 
{ 
    [Key, Display(Name= "Order ID")] 
    [ScaffoldColumn(false)] 
    public int OrderID { get; set; } 


    private DateTime _date = DateTime.Today; 
    [Display(Name = "Date Posted")] 
    [ScaffoldColumn(false)] 
    public DateTime OrderPostDate 
    { 
     get { return _date; } 
     set { _date = value; } 
    } 

    [EnumDataType(typeof(PersonReqID)),Display(Name = "Person Requesting")] 
    public PersonReqID PersonReq { get; set; } 

    [StringLength(100), Display(Name = "Grant")] 
    public string GrantID { get; set; } 

    [StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)] 
    public string ItemDescription { get; set; } 

    [StringLength(100), Display(Name = "Quantity")] 
    public string ItemQuantity { get; set; } 

    [StringLength(100), Display(Name = "Price")] 
    public string UnitPrice { get; set; } 

    [StringLength(100), Display(Name = "Company")] 
    public string CompanyID { get; set; } 

    [StringLength(100), Display(Name = "Catalog #")] 
    public string CatalogNum { get; set; } 

    [ScaffoldColumn(false)] 
    [Range(typeof(DateTime), "1/1/1111", "1/1/3000", ErrorMessage = "Please provide a date.")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
    public DateTime OrderMadeDate { get; set; } 

    [ScaffoldColumn(false)] 
    [Range(typeof(DateTime), "1/1/1111", "1/1/3000", ErrorMessage = "Please provide a date.")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] 
    public DateTime OrderRecieveDate { get; set; } 

    [ScaffoldColumn(false)] 
    [EnumDataType(typeof(PersonRecID)), Display(Name = "Person Recieving")] 
    public PersonRecID PersonRec { get; set; } 

    [ScaffoldColumn(false)] 
    [StringLength(100), Display(Name = "Item Location")] 
    public string ItemLoc { get; set; } 
} 

Моего Configuration.cs файл:

context.OrderForms.AddOrUpdate(
       new OrderForm 
       { 
        OrderID=1, 
        OrderPostDate=DateTime.Now, 
        PersonReq=PersonReqID.Jake, 
        GrantID="NASA", 
        ItemDescription="Grenades", 
        ItemQuantity="100", 
        UnitPrice="1.50", 
        CompanyID="Grenades UNLMTD", 
        CatalogNum="G1001", 
        PersonRec=PersonRecID.Ajit, 
        ItemLoc="Freezer" 
       } 

       ); 

     context.SaveChanges(); 

и, наконец, мой xxxxxxx_initial.cs миграция файл:

public override void Up() 
    { 
     AddColumn("dbo.OrderForms", "OrderRecieveDate", c => 
     c.DateTime(nullable: false, defaultValue: new DateTime(1000, 1, 1))); 
     AddColumn("dbo.OrderForms", "OrderMadeDate", d => 
     d.DateTime(nullable: false, defaultValue: new DateTime(1000, 1, 1))); 

    } 

    public override void Down() 
    { 
     DropColumn("dbo.OrderForms", "OrderRecieveDate"); 
     DropColumn("dbo.OrderForms", "OrderMadeDate"); 

    } 

Я очень новый для веб-дизайна, и поэтому я просто заканчиваю все, что, по-моему, потенциально может вызвать проблему. Вот определение таблицы для моего файла OrderForms.dbo.

CREATE TABLE [dbo].[OrderForms] (
[OrderID]   INT   IDENTITY (1, 1) NOT NULL, 
[GrantID]   NVARCHAR (100) NULL, 
[ItemDescription] NVARCHAR (MAX) NULL, 
[ItemQuantity]  NVARCHAR (100) NULL, 
[UnitPrice]  NVARCHAR (100) NULL, 
[CompanyID]  NVARCHAR (100) NULL, 
[CatalogNum]  NVARCHAR (100) NULL, 
[OrderDate]  NVARCHAR (100) NULL, 
[ItemLoc]   NVARCHAR (100) NULL, 
[PersonReq]  INT   DEFAULT ((0)) NULL, 
[PersonRec]  INT   DEFAULT ((0)) NULL, 
[OrderPostDate] DATETIME  DEFAULT ('1900-01-01T00:00:00.000') NULL, 
[OrderRecieveDate] DATETIME  DEFAULT ('2013-01-01T00:00:00.000') NULL, 
[OrderMadeDate] DATETIME  DEFAULT ('2013-01-01T00:00:00.000') NULL, 
CONSTRAINT [PK_dbo.OrderForms] PRIMARY KEY CLUSTERED ([OrderID] ASC) 

);

Любая помощь была бы принята с благодарностью. Я не могу понять, как создается столбец дважды. Я попытался удалить базу данных и предыдущие миграции и сделать «enable-migrations -forced» и перезапустить оттуда безрезультатно. Вероятно, это связано с отсутствием базовых знаний об EF с моего конца. Заранее благодарю за любую помощь!

+0

Возможно ли, что ваша версия базы данных вышла из синхронизации - это значит, что она пытается обновиться, добавив 'OrderRecieveDate' в таблицу, где она существует? То же самое происходит, если вы создаете чистую БД с полем на модели и без миграции? – Basic

+0

Я считаю, что может возникнуть проблема. Я попытался создать новую базу данных и засеять некоторую новую информацию, и теперь я получаю новую ошибку, в которой говорится: «Не удалось выполнить проверку для одного или нескольких объектов. Подробнее см.« Свойство EntityValidationErrors ». – user3294244

+0

Мне не нравится спрашивать очевидное, но ... Что содержит свойство EntityValidationErrors? – Basic

ответ

0

Так что может быть искажая то, что у вас есть, но не создавать столбцы один раз в определении:

CREATE TABLE [dbo].[OrderForms] (
[OrderID]   INT   IDENTITY (1, 1) NOT NULL, 
[GrantID]   NVARCHAR (100) NULL, 
[ItemDescription] NVARCHAR (MAX) NULL, 
[ItemQuantity]  NVARCHAR (100) NULL, 
[UnitPrice]  NVARCHAR (100) NULL, 
[CompanyID]  NVARCHAR (100) NULL, 
[CatalogNum]  NVARCHAR (100) NULL, 
[OrderDate]  NVARCHAR (100) NULL, 
[ItemLoc]   NVARCHAR (100) NULL, 
[PersonReq]  INT   DEFAULT ((0)) NULL, 
[PersonRec]  INT   DEFAULT ((0)) NULL, 
[OrderPostDate] DATETIME  DEFAULT ('1900-01-01T00:00:00.000') NULL, 
[OrderRecieveDate] DATETIME  DEFAULT ('2013-01-01T00:00:00.000') NULL, 
[OrderMadeDate] DATETIME  DEFAULT ('2013-01-01T00:00:00.000') NULL, 
CONSTRAINT [PK_dbo.OrderForms] PRIMARY KEY CLUSTERED ([OrderID] ASC) 

Тогда попытка создать их снова

public override void Up() 
    { 
     AddColumn("dbo.OrderForms", "OrderRecieveDate", c => 
     c.DateTime(nullable: false, defaultValue: new DateTime(1000, 1, 1))); 
     AddColumn("dbo.OrderForms", "OrderMadeDate", d => 
     d.DateTime(nullable: false, defaultValue: new DateTime(1000, 1, 1))); 

    } 

Если вам нужен совет по устранению неполадок вы можете использовать sys.tables и sys.columns, чтобы найти значения, и IF NOT EXISTS в ваших столбцах добавления.

Это потребует некоторой модификации, но этого может быть достаточно, чтобы вы могли двигаться.

string columnToAdd = " ADD [" + columnList[i] + "] " + columnDataTypeList[i]; 
    string alterTableSQL = @"ALTER TABLE " + DestinationTbl + columnList[i]; 
    string columnMakerSQL += @"IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'" + DestinationTbl 
           + @"') AND name = '" + columnList[i] 
           + @"') BEGIN " 
           + alterTableSQL 
           + @" END "; 
Смежные вопросы

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