Я настраиваю новый сервер с 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 }
Я пытался:
[DatabaseGenerated(DatabaseGeneratedOption.**(None|Identity|Computed)**)]
Я использую None
, который используется по умолчанию для Entity Framework.Объект ID всегда 0 .Таким образом, первое выполнение правильное, но последующие - не потому, что они имеют одинаковый идентификатор.Поэтому я использую Identity|Computed
, но он выдает ** Оптимистическую ошибку параллелизма *.Я хочу использовать Identity
, потому что с Computed
у меня тот же результат, но он будет модифицировать идентификатор при каждой модификации.
Я добавил / удалил ([Database...]
и [key]
) и все их комбинации.
Я проверил, что начиная с Microsoft SQL Server Management Studio вставкиявляются правильными, и они.
Я пробовал это с другими классами, и у меня тот же результат.
У меня та же проблемас [MDCreationDate]
свойством.Когда приложение создает объект, оно получает значение 0001-01-01 00:00:00...
вместо текущей даты.
Я ожидал, что при выполнении вставки идентификатор будет следующей из последовательности и даты сервера sql.