Entity Framework 6.2 не учитывает значения по умолчанию при вставке в SQL Server 2017

Я устанавливаю новый сервер с MVC 5.2, Entity Framework 6.2 и SQL Server 2017.

Когда я собираюсь создать новый объект, некоторые из их свойств были определены как значения по умолчанию в моих таблицах. Если я вставляю из Microsoft SQL Server Management Studio, выполнения выполняются правильно, но когда я делаю это из моего приложения MVC 5, это выдает мне разные ошибки в зависимости от того, что я делаю.

Я определил таблицу так:

CREATE TABLE [SchemaTable].[Table]
(
    [TableID]       BIGINT NOT NULL,

    [Name]          NVARCHAR(30) NOT NULL,
    [Description]   NVARCHAR(MAX) NOT NULL,

    [MDCreatorID]       NVARCHAR (128) NOT NULL,
    [MDCreationDate]    DATETIMEOFFSET(7) NOT NULL,
    [MDDeleteDate]      DATETIMEOFFSET(7) NULL,

    CONSTRAINT PK_EventID PRIMARY KEY ([TableID]),
    CONSTRAINT FK_Event_MDCreatorID FOREIGN KEY ([MDCreatorID])
        REFERENCES [dbo].[AspNetUsers] ([Id]),
    CONSTRAINT UC_EventName UNIQUE ([Name])
);
GO

CREATE SEQUENCE [SchemaTable].[SQ_Table_ID]
  AS BIGINT
  START WITH 10000
  INCREMENT BY 1
  MINVALUE 10000
  MAXVALUE 19999
  NO CYCLE;
GO
ALTER TABLE [SchemaTable].[Table] ADD CONSTRAINT
    DFT_Event_ID DEFAULT (NEXT VALUE FOR [SchemaTable].[SQ_Table_ID]) FOR [EventID];
GO
ALTER TABLE [SchemaTable].[Table] ADD CONSTRAINT
    DFT_Table_CreationDate DEFAULT GETDATE() FOR [MDCreationDate];
GO
ALTER TABLE [SchemaTable].[Table] ADD CONSTRAINT
    DFT_Table_DeleteDate DEFAULT NULL FOR [MDDeleteDate];
GO

Для создания модели я использовал ADO.NET Entity Data Model, Code First из базы данных и несколько моих модификаций, получившаяся модель:

 1 [Table("SchemaTable.Table")]
 2 public partial class Table
 3 {
 4      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
 5      public Table()
 6      {
 7          Legs = new HashSet<Leg>();
 8      }
 9
10      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
11      public long TableID { get; set; }
12
13      [Required]
14      [StringLength(30)]
15      public string Name { get; set; }
16
17      [Required]
18      [DataType(DataType.MultilineText)]
19      public string Description { get; set; }
20
21      [Required]
22      [StringLength(128)]
23      [ScaffoldColumn(false)]
24      public string MDCreatorID { get; set; }
25
26      [Required]
27      [ScaffoldColumn(false)]
28      public DateTimeOffset MDCreationDate { get; set; }
29
30      [ScaffoldColumn(false)]
31      public DateTimeOffset? MDDeleteDate { get; set; }
32
33      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
34      public virtual ICollection<Leg> Leg { get; set; }
35 }

Для создания контроллера я использовал Scaffolding и некоторые из моих модификаций:

контроллер

 1 [HttpPost]
 2 [ValidateAntiForgeryToken]
 3 public ActionResult Create([Bind(Include = "TableID,Name,Description,MDCreatorID,MDCreationDate,MDDeleteDate")] Table @table)
 4 {
 5      var userID = User.Identity.GetUserId();
 6
 7      if (userID != null)
 8      {
 9          @table.MDCreatorID = userID;
10
11          ModelState["MDCreatorID"].Errors.Clear();
12
13          UpdateModel(@table);
14
15          if (ModelState.IsValid)
16          {
17              db.Table.Add(@table);
18
19              db.SaveChanges();
20
21              return RedirectToAction("Index");
22          }
23      }
24      else
25      {
26          ViewBag.Error = "User Id is null";
27      }
28
29      return View(@event);
30 }

Я пытался:

  1. [DatabaseGenerated(DatabaseGeneratedOption.**(None|Identity|Computed)**)] я использую None это по умолчанию для Entity Framework. Идентификатор объекта всегда равен 0. Таким образом, первое выполнение правильное, но последующие - не потому, что они имеют одинаковый идентификатор. Поэтому я использую Identity|Computed но он выдает ** оптимистическую ошибку параллелизма *. Я хочу использовать Identity потому что с Computed У меня тот же результат, но он будет модифицирован идентификатор при каждой модификации.

  1. Я добавил / удалил ([Database...] а также [key]) и все их комбинации.

  2. Я проверил, что начиная с Microsoft SQL Server Management Studio вставки правильные, и они есть.

  3. Я пробовал это с другими классами, и у меня такой же результат.

У меня та же проблема с [MDCreationDate] propierty. Когда приложение создает объект, оно получает значение 0001-01-01 00:00:00... вместо текущей даты.

Я ожидал, что когда я сделаю вставку, идентификатор будет следующей из последовательности и даты сервера SQL.

0 ответов

Другие вопросы по тегам