向绑定对象添加新字段ion时,DbContext失败,出现InvalidOperationException



所以这是我的binding类型:

public class ClipboardItem : INotifyPropertyChanged
{        
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
private int id { get; set; }
private string text;
private string name;        
private string processName;
private string time;
public ClipboardItem(int id, string text, string name, string processName, string time, bool isPinned)
{
this.id = id;
this.text = text;
this.name = "";          
this.processName = processName;
this.time = time;
}
}

DbContext

public class ClipboardItemContext : DbContext
{
public DbSet<ClipboardItem> Clipboards { get; set; }
public string DbPath { get; }
public ClipboardItemContext()
{
var folder = Environment.SpecialFolder.LocalApplicationData;
var path = Environment.GetFolderPath(folder);
DbPath = System.IO.Path.Join(path, "clipboards.db"); 
Database.EnsureCreated();
}
// The following configures EF to create a Sqlite database file in the
// special "local" folder for your platform.
protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlite($"Data Source={DbPath}");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ClipboardItem>().HasKey(p => new { p.Id });
}
}

所以这很好,我可以从我的DBaddreadupdatedelete项。

现在我想在我的binding type:中添加新字段

private bool isPinned;

我的Ctor

public ClipboardItem(int id, string text, string name, string processName, string time, bool isPinned)
{
this.id = id;
this.text = text;
this.name = "";          
this.processName = processName;
this.time = time;
this.isPinned= isPinned;
Properties.Settings.Default.ItemIndex++;
}

在再次运行我的应用程序之前,我删除了我的.db文件,因为这个新字段,当我尝试启动应用程序时,我得到了这个exception:

System.InvalidOperationException:'未找到合适的构造函数对于实体类型"ClipboardItem"。以下构造函数无法绑定到实体类型的属性的参数:无法绑定ClipboardItem中的"isPinned"(int id,string text,stringname,string processName,string time,bool is Pined('。'

我的DB似乎不接受这个新字段,我也尝试添加不同的type,例如intstring,但我再次收到相同的错误。

当我删除这个新字段时,我创建了.db并运行了application

Sqlite没有单独的布尔存储类。相反布尔值存储为整数0(假(和1(真(

只需将您的字段映射到整数,

[Column(TypeName = "INTEGER")]
public bool isPinned;

或者你可以用OnModelCreating来做,

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ClipboardItem>().HasKey(p => new { p.Id });
modelBuilder.Entity<ClipboardItem>().Property(p => p.isPinned)    
.HasConversion(x => x ? 1 : 0,       
x => (x == 1));
}

最新更新