Entity Framework 6.2 не учитывает значения по умолчанию при вставке в SQL Server 2017 - PullRequest
0 голосов
/ 14 мая 2019

Я настраиваю новый сервер с 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.Объект ID всегда 0 .Таким образом, первое выполнение правильное, но последующие - не потому, что они имеют одинаковый идентификатор.Поэтому я использую Identity|Computed, но он выдает ** Оптимистическую ошибку параллелизма *.Я хочу использовать Identity, потому что с Computed у меня тот же результат, но он будет модифицировать идентификатор при каждой модификации.

Error

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

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

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

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

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

...