У меня странная проблема с использованием ядра Framework Entity для вставки записей с столбцами значений по умолчанию.
Есть ли другой способ получить ожидаемое поведение, я упускаю что -то глупое? < /p>
tldr: настройка свойства int = 0 или bool для истинных результатов в используемых значениях по умолчанию
String.Empty для новой строки дает ORA-01400: не может вставить нуль (это, похоже, Oracle вещь) < /p>
Сценарии:
Использование миграции для добавления новых столбцов и добавления новых записей приводит к нормальному поведению (значения по умолчанию вставлены) < /p>
< P> Добавление новой записи только по предоставлению Oldfield = OK
"ID" : 6, "OLDFIELD" : "ef test 1", "NEWINT" : 5, "NEWSTRING" : "def", "NEWBOOLFALSE" : 0, "NEWBOOLTRUE" : 1< /code> < /p>
Добавление с значением, отличным от .NET по умолчанию, тоже работает
"ID" : 12, "OLDFIELD" : "ef test all set", "NEWINT" : 42, "NEWSTRING" : "string here", "NEWBOOLFALSE" : 1, "NEWBOOLTRUE" : 1< /code> < /p>
Теперь проблемы
Когда вы указываете 0 для int и false для bools < /p>
var test = new TestDef()
{
OldField = "ef bad test",
NewInt = 0,
NewBoolFalse = false,
NewBoolTrue = false
};
_womaDbContext.Add(test);
await _womaDbContext.SaveChangesAsync();
< /code>
Вы получаете «id»: 36, «Oldfield»: «Ef Bad Test», «Newint»: 5, «Newstring»: «def», «Newboolfalse»: 0, « Newbooltrue ": 1
newstring = string.empty дает исключение Oracle ORA-01400: не может вставить NULL (это, кажется, оракул вещь) < /p>
Вставка запроса нормально < /p>
INSERT INTO WOMA_SCHEMA.TESTDEF
(ID, OLDFIELD, NEWINT, NEWBOOLFALSE, NEWBOOLTRUE)
VALUES("WOMA_SCHEMA"."ISEQ$$_42048".nextval, 'sql empty',0, 0,0);
< /code>
Это делает невозможным вставить ложное значение в Newbooltrue или 0 в Newint, не выполняя обновление < /p>
testclass (dbcontext onmodelcreating calls testdef. OnModelCreating (ModelBuilder)): < /p>
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Test.Model
{
[Table("TESTDEF")]
public class TestDef
{
[Column("ID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column("OLDFIELD")]
public string OldField { get; set; }
[Required]
[Column("NEWINT")]
public int NewInt { get; set; }
[Required]
[Column("NEWSTRING")]
public string NewString { get; set; }
[Required]
[Column("NEWBOOLTRUE")]
public bool NewBoolTrue { get; set; }
[Required]
[Column("NEWBOOLFALSE")]
public bool NewBoolFalse { get; set; }
public static void OnModelCreating(ModelBuilder modelBuilder)
{
// Default values
modelBuilder
.Entity()
.Property(e => e.NewInt)
.HasDefaultValue(5);
modelBuilder
.Entity()
.Property(e => e.NewString)
.HasDefaultValue("def");
modelBuilder
.Entity()
.Property(e => e.NewBoolTrue)
.HasDefaultValue(true);
modelBuilder
.Entity()
.Property(e => e.NewBoolFalse)
.HasDefaultValue(false);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/697 ... lue-is-set
Проблема с EF Core 5 HasDefaultValue, EF выдвигает значение по умолчанию, когда значение устанавливается на тип .NET по ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Используйте T4 для замены HasDefaultValue на HasDefaultValueSql в EF Core 8.
Anonymous » » в форуме C# - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-