我有rest在.NET核心和EF Core3.0,我得到一个奇怪的问题。下面是我的实体。
[Table(name: "BizObjects")]
public class BizObject
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
[StringLength(06)]
public int Id { get; set; }
public string Category { get; set; } //FK
[MaxLength(2)]
public int ItemIncrement { get; set; }
[MaxLength(2)]
public int SubItemIncrement { get; set; }
public virtual BizObjectT BizObjectT { get; set; }
}
[Table(name: "BizObjectsT")]
public class BizObjectT
{
[StringLength(02)]
public string Lang { get; set; }
public string Text { get; set; }
#region Primary Key derived from Foreign key for Config tabels
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[ForeignKey(name: "BizObjectId")]
[Required]
public int BizObjectId { get; set; }
public virtual BizObject BizObject { get; set; }
#endregion
}这是我的DbContext。
public class ApplicationContext : DbContext, IDisposable
{
public ApplicationContext(DbContextOptions options)
: base(options: options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BizObject>()
.HasOne<BizObjectT>(s => s.BizObjectT)
.WithOne(g => g.BizObject)
.HasForeignKey<BizObjectT>(s => s.BizObjectId);
}
public DbSet<BizObject> BizObjects { get; set; }
public DbSet<BizObjectT> BizObjectsT { get; set; }
}这一切都很好。我能够创建迁移,并可以将其部署到数据库。我的外键在API中正常工作。
但是我遇到的问题是关于SQL服务器。在这里,我无法在关系窗口的实现中找到外键主表。即使尝试手动添加FK,我也看不到表的状态。
见下面的快照。

我不知道问题在哪里,任何建议都会有很大帮助。
谢谢。
更新1 :
下面是实体生成的迁移。
public partial class initial : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "BizObjects",
columns: table => new
{
Id = table.Column<int>(maxLength: 6, nullable: false),
Category = table.Column<string>(nullable: true),
ItemIncrement = table.Column<int>(maxLength: 2, nullable: false),
SubItemIncrement = table.Column<int>(maxLength: 2, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_BizObjects", x => x.Id);
});
migrationBuilder.CreateTable(
name: "BizObjectsT",
columns: table => new
{
BizObjectId = table.Column<int>(nullable: false),
Lang = table.Column<string>(maxLength: 2, nullable: true),
Text = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_BizObjectsT", x => x.BizObjectId);
table.ForeignKey(
name: "FK_BizObjectsT_BizObjects_BizObjectId",
column: x => x.BizObjectId,
principalTable: "BizObjects",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "BizObjectsT");
migrationBuilder.DropTable(
name: "BizObjects");
}
}奇怪的是,如果我更改数据库名,它就会工作。但只有前几张桌子。
假设我在迁移中有10个表,这个BizObject是第一个表,然后在更改数据库名称之后,SQL将引用BizObject,而不是其他表,这是随机的。
供参考:
Rest :
今天,我将使用新版本的SQL server和SSMS检查所有这些内容,稍后将在这里发布更新。
更新2 :
问题似乎出现在SQL server或SSMS上,因为我删除了几个表并运行了迁移,外键不起作用,但是在关系表的下拉列表中,我可以看到在迁移中没有添加的表名。
发布于 2019-11-21 06:55:52
你的FK注释不是关闭了吗?而不是
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[ForeignKey(name: "BizObjectId")]
[Required]
public int BizObjectId { get; set; }
public virtual BizObject BizObject { get; set; } 不是这样的吗?
[Required]
public int BizObjectId { get; set; }
[ForeignKey(name: "BizObjectId")]
public virtual BizObject BizObject { get; set; }请参阅:EF核心文件
我还删除了[Key]属性,因为我非常确定它不能同时是键和外键--如果您愿意,可以添加唯一的索引。或者,如果它确实用作PK (1:1),您应该删除[DatabaseGenerated]属性,因为在子记录中,它不能由DB生成。
发布于 2019-11-22 07:42:29
最后,我想我找到了根本原因。
不是别人,而是SSMS。我已经将我的SQL server和SSMS更新为最新版本,并且它已经开始正常工作。稍后会发布更多的最新消息..。
https://stackoverflow.com/questions/58949163
复制相似问题