gpt4 book ai didi

c# - Initializer.Seed() 在 context.SaveChanges() 上抛出异常

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:51 24 4
gpt4 key购买 nike

我对 EntityFramework 比较陌生(今天开始使用它!)

我有以下代码:

    public class DemoContext : DbContext
{
public DemoContext() : base("demoContext")
{

}

public DbSet<BaseUser> Users {get; set;}
public DbSet<BaseSession> Sessions {get;set;}
}

public class DemoInitializer : DropCreateDatabaseAlways<DemoContext>
{
protected override void Seed(DemoContext context)
{
var staffUsers = new List<StaffUser>
{
new StaffUser {Id=1,Username="test",Password="test",DisplayName="test user",AccessFlags=(AccessFlags)2048 },
};

staffUsers.ForEach(su => context.Users.Add(su));
context.SaveChanges();
}
}

但是每当context.SaveChanges();行被调用,它抛出以下异常:

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code

Additional information: Error retrieving values from ObjectStateEntry. See inner exception for details.

内部异常是:

The given key was not present in the dictionary.

虽然目前这个错误对我来说意义不大,谷歌搜索也没有产生任何答案,但我似乎设法将其确定为与公共(public)属性(property)有关 DbSet<BaseSession> Sessions {get;set}在 DemoContext 类上(我的意思是,如果我将其注释掉,错误就不会发生,我们走了!)

这是为什么,正确的解决方法是什么?

如果我使用 Initializer.Seed(),是否需要对 DbContext 中存在的所有 DbSet 属性执行某些操作?
我假设您实际上不必用数据填充它们,因为这没有意义?

.
完整异常的屏幕截图,以防有用! Screenshot of the full exception, incase it's useful!

.
编辑

我已将其归结为 BaseSession 的具体实现存在问题类:

public class UniqueSession : BaseSession
{
public Date DateOfSession { get; set; }
public string Comments { get; set; }
}

如您所见,它使用自定义 Date类,这是我从这里的另一个问题中窃取的:

    public class Date : IEquatable<Date>, IEquatable<DateTime>
{
public Date(DateTime date)
{
value = new DateTime(date.Date.Ticks, DateTimeKind.Unspecified);
//value = date.Date;
}

public bool Equals(Date other)
{
return other != null && value.Equals(other.value);
}

public bool Equals(DateTime other)
{
return value.Equals(other);
}

public override string ToString()
{
return value.ToString();
}
public static implicit operator DateTime(Date date)
{
return date.value;
}
public static explicit operator Date(DateTime dateTime)
{
return new Date(dateTime);
}

private DateTime value;
}

如果我切换 UniqueSession.DateOfSession成为DateTime , 不会出现这个错误?

.
编辑 2
如果我更改 Date类使得 private DateTime value;实际上是一个公共(public)属性(public DateTime value { get; set; }),错误消失了!

但为什么呢?

最佳答案

复杂类型是(除其他外)“在数据库中创建列”的快捷方式。

类的一个公共(public)属性的一列。由于类中没有属性,因此没有要映射/创建的列。

这可能会使 EF 感到困惑。

关于c# - Initializer.Seed() 在 context.SaveChanges() 上抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30624401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com