DbUpdateException при добавлении элемента в контекст Entity Framework - PullRequest
0 голосов
/ 24 марта 2020

У меня есть два следующих класса:

public class Record
{
    public int RecordId { get; set; }

    public DateTime? InsertDate { get; set; } = DateTime.Now;
    public DateTime BookingDate { get; set; }
    public string AmountTypeName { get; set; }
    public double? Amount { get; set; }
    public string BookingAccountID { get; set; }
    public string AccountCurrency { get; set; }
    public string ClientCurrency { get; set; }
    public string AffectsBalance { get; set; }
    public double? AmountAccountCurrency { get; set; }
    public string AmountClientCurrency { get; set; }

    public int UnifiedInstrumentCode { get; set; }
    public InstrumentInfo InstrumentInfo { get; set; }
}

public class InstrumentInfo
{
    [Key]
    public int UnifiedInstrumentCode { get; set; }
    public ICollection<Record> Record { get; set; }

    public string AssetType { get; set; }
    public int UnderlyingInstrumentUic { get; set; }
    public string UnderlyingInstrumentSubType { get; set; }
    public string InstrumentSymbol { get; set; }
    public string InstrumentDescription { get; set; }
    public string InstrumentSubType { get; set; }
    public string UnderlyingInstrumentAssetType { get; set; }
    public string UnderlyingInstrumentDescription { get; set; }
    public string UnderlyingInstrumentSymbol { get; set; }
}

, которые я хочу использовать в качестве контекста для EF6.

Я определил контекст следующим образом:

public class TransactionsContext: DbContext
{
    public DbSet<Record> Records { get; set; }
    public DbSet<InstrumentInfo> InstrumentInfos { get; set; }

    public TransactionsContext()
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<TransactionsContext>(null);
        base.OnModelCreating(modelBuilder);
    }
}

Если я запускаю тест против него, который добавит и объект InstrumentInfo к БД

[TestMethod]
public void AddInstrumentInfo_Added_IsTrue()
{
    InstrumentInfo info = FakeFactory.GetInstrumentInfo();
    using (var ctx = new TransactionsContext())
    {
        ctx.InstrumentInfos.Add(info);
        ctx.SaveChanges();
    }
}

, я получу следующее исключение:

SqlException: Невозможно вставить значение NULL в столбец «UnifiedInstrumentCode», таблица «TransactionsContext.dbo.InstrumentInfoes»; столбец не допускает пустых значений. Вставить не удается. Утверждение было прекращено.

Я перепробовал все различные сценарии ios, которые я нашел здесь , но я не мог понять, что я делаю неправильно.

Конечная цель состоит в том, чтобы я определил два моих класса таким образом, чтобы «Запись» была связана с таблицей «InstrumentInfo» через свойство «UnifiedInstrumentCode». Я предполагаю, что мои ограничения для этих двух таблиц все еще не верны, но я не могу понять, как определить это в EF6 (сначала код), чтобы это работало.

1 Ответ

0 голосов
/ 26 марта 2020

Добавление аннотации [DatabaseGenerated (DatabaseGeneratedOption.None)] к моему первичному ключу в InstrumentInfo решило проблему:

public class InstrumentInfo
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UnifiedInstrumentCode { get; set; }
    public ICollection<Record> Record { get; set; }

    public string AssetType { get; set; }
    public int UnderlyingInstrumentUic { get; set; }
    public string UnderlyingInstrumentSubType { get; set; }
    public string InstrumentSymbol { get; set; }
    public string InstrumentDescription { get; set; }
    public string InstrumentSubType { get; set; }
    public string UnderlyingInstrumentAssetType { get; set; }
    public string UnderlyingInstrumentDescription { get; set; }
    public string UnderlyingInstrumentSymbol { get; set; }
}

Я больше не исследовал, но думаю, что если добавляется новая запись, EF изначально создает и объект InstrumentInfo, который имеет нулевое значение для своего первичного ключа, что вызывает исключение.

Надеюсь, это поможет, если кто-то столкнется с той же проблемой в будущем.

...