无法跟踪.Net核心中类型的实例



我得到了其中一个表的以下错误。该表没有主键。如何处理?我正试图在表中添加新行。

错误

Unable to track an instance of type 'CommonDataZipInfo' because it does not have a primary key. 
Only entity types with primary keys may be tracked.'

DataContext.cs

modelBuilder.Entity<CommonDataZipInfo>(entity =>
{
entity.HasNoKey();
entity.ToTable("COMMON_DATA_ZIP_INFO");
entity.Property(e => e.AddDate).HasColumnType("datetime");
entity.Property(e => e.ManuscriptNum)
.HasColumnName("manuscript_num")
.HasMaxLength(32)
.IsUnicode(false);
entity.Property(e => e.ZipfileName)
.HasMaxLength(32)
.IsUnicode(false);
});

程序.cs

var CommonDataZipInfo = new CommonDataZipInfo()
{
ManuscriptNum = ManuscriptNum,
ZipfileName = Path.GetFileName(fileName),
AddDate = DateTime.Now
};
context.CommonDataZipInfo.Add(CommonDataZipInfo);
context.SaveChanges();

我在这里遇到了同样的问题。这些是我的代码:

[…]

public partial class Radusergroup
{
public string Username { get; set; }
public string Groupname { get; set; }
public int Priority { get; set; }
}

[…]

[…]

modelBuilder.Entity<Radusergroup>(entity =>
{
entity.HasNoKey();
entity.ToTable("radusergroup");
entity.HasIndex(e => e.Username)
.HasName("username");
entity.Property(e => e.Groupname)
.IsRequired()
.HasColumnName("groupname")
.HasMaxLength(64)
.HasDefaultValueSql("''''''");
entity.Property(e => e.Priority)
.HasColumnName("priority")
.HasColumnType("int(11)")
.HasDefaultValueSql("'1'");
entity.Property(e => e.Username)
.IsRequired()
.HasColumnName("username")
.HasMaxLength(64)
.HasDefaultValueSql("''''''");
});

[…]

由于您没有为表创建键,有时由于某些原因无法更改数据库。在我的情况下,这是另一个应用程序使用的数据库,所以我不想损害其他应用程序,所以我的解决方案只是简单地将我的属性"用户名";插入一个密钥,如下所示:

public partial class Radusergroup
{
[Key]
public string Username { get; set; }
public string Groupname { get; set; }
public int Priority { get; set; }
}

并删除上下文中的HasNoKey:

[…]

modelBuilder.Entity<Radusergroup>(entity =>
{
//entity.HasNoKey();
entity.ToTable("radusergroup");
entity.HasIndex(e => e.Username)
.HasName("username")
.IsUnique();
entity.Property(e => e.Groupname)
.IsRequired()
.HasColumnName("groupname")
.HasMaxLength(64)
.HasDefaultValueSql("''''''");
entity.Property(e => e.Priority)
.HasColumnName("priority")
.HasColumnType("int(11)")
.HasDefaultValueSql("'1'");
entity.Property(e => e.Username)
.IsRequired()
.HasColumnName("username")
.HasMaxLength(64)
.HasDefaultValueSql("''''''");
});

[…]

这可能会解决问题。

EF实体必须需要一个主键才能操作,并且该主键可以存在也可以不存在于表中。

根据我的经验(这是一种变通方法(,我试图使用几个列来找到一个唯一的键,并在模型中定义它。也许你可以使用无钥匙实体类型。

我遇到了同样的问题,这里的各种答案对我有所帮助。只是添加了我的最终解决方案。

正如其他人所指出的,当表没有主键时,问题就会出现。如果您无法选择在表中添加键或更改上下文(如环德所建议的(另一种选择是执行原始sql,如下所示:

using (var context = new YourContext())
{
var result = context.YourTable.FromSqlRaw("SELECT something FROM something");
}

只需将[Key]属性添加到某个唯一的数字字段中。它不需要在服务器上定义为PM并删除实体。HasNoKey((调用。

我遇到了同样的问题,我只是在表中添加了一个主键。首先,将表中的id字段添加为int,并将"Is Identity"设置为yes。然后使用Microsoft SQL Management Studio,右键单击id行并选择";设置主键";。然后运行Scaffold DbContext生成合适的上下文类

我遇到了同样的问题,但我使用以下代码解决了问题

modelBuilder.Entity<CommonDataZipInfo>(entity =>
{
entity.HasKey(e => e.ManuscriptNum);
entity.ToTable("COMMON_DATA_ZIP_INFO");
entity.Property(e => e.AddDate).HasColumnType("datetime");
entity.Property(e => e.ManuscriptNum)
.HasColumnName("manuscript_num")
.HasMaxLength(32)
.IsUnicode(false);
entity.Property(e => e.ZipfileName)
.HasMaxLength(32)
.IsUnicode(false);
});

添加实体。HasKey(e=>e.ManuscriptNum(;如果它是键值,则添加到DbContext中,否则您应该将键值添加到表中。实体框架通常需要数据库表中的主键列或键列。

在ASP.NET MVC EF Core6中面临同样的问题,现在它已经解决了。只有当您的DBContext派生类具有Fluent API(如.HasNoKey((、.HasIndex((等(时,您才会面临创建无键实体的问题。当您使用Scaffolding Database命令行生成DBContext类和实体时,会添加这些Fluent API。不要用这个。由于这些流畅的api,您正面临着这个问题。要解决此问题,请遵循以下步骤:

  1. 根据您的要求创建数据库表,可以使用关键字,也可以不使用关键字
  2. 手动创建相应的Entity类
  3. 使用Visual Studio创建DBContext派生类。为此,请选择控制器文件夹并选择添加新的控制器,然后选择使用实体FrameworK添加读写操作
  4. 在对话框中,选择在步骤2中创建的实体,然后单击+号生成DBContext派生类
  5. 现在,DBContext派生类将没有那些流畅的api。运行应用程序,所有crud操作都会正常工作

最新更新