我还是 .NET 的新手,尤其是 ef 核心。我在使用现有数据库的代码优先方法定义实体之间的关系时遇到问题。我使用 Visual Studio Code 开发它,我不能做模型优先的方法。我有 2 个 1:1 关系的表。为了实现下面的json结构,我创建了3个实体(其中1个实体需要拆分)。根据我定义的关系,它抱怨实体已经被使用。有人可以指点我在定义关系时做错了什么吗?
我收到以下错误:
System.InvalidOperationException:不能将表 'dbo.unitDetailTbl' 用于实体类型 'contact',因为它正在用于实体类型 'address' 和可能的其他实体类型,但没有链接关系。将外键添加到主键属性上的“联系人”,并指向映射到“dbo.unitDetailTbl”的另一个实体上的主键。
表结构(1 对 1 关系)
- unitInfoTbl (unitId, 名称)
- unitDetailTbl (unitId, addr1, phone)
CREATE TABLE [dbo].[unitDetailTbl](
[UnitId] [int] NOT NULL Primary Key,
[Addr1] [varchar](250) NULL,
[Phone][varchar](32) NULL,
)
GO
CREATE TABLE [dbo].[unitInfoTbl](
[UnitId] [int] NOT NULL Primary Key,
[Name] [varchar](250) NULL,
Foreign Key (UnitId) REFERENCES [unitDetailTbl](UnitId)
)
GO
INSERT INTO dbo.unitDetailTbl VALUES (1,'123 East Madison','123-456-7891');
INSERT INTO dbo.unitInfoTbl VALUES (1,'Building');
GO
预期结果
[
{
"unitId": 1,
"name": "Building",
"address": {
"unitId": 1,
"addr1": "123 East Madison"
},
"contact": {
"unitId": 1,
"phone": "123-456-7891"
}
}
]
楷模
public partial class unitInfo
{
[Key]
public int UnitId { get; set; }
public string name { get; set; }
public virtual address address { get; set;}
public virtual contact contact { get; set;}
}
public partial class contact
{
[Key,JsonIgnore]
public int UnitId { get; set; }
public string phone {get; set;}
public virtual unitInfo unitInfoContact {get;set;}
}
public partial class address
{
[Key,JsonIgnore]
public int UnitId { get; set; }
public string Addr1 {get; set;}
public virtual unitInfo unitInfoAddress { get; set; }
}
语境
public partial class unitInfoContext : DbContext
{
public unitInfoContext()
{
}
public unitInfoContext(DbContextOptions<unitInfoContext> options)
: base(options)
{
}
public virtual DbSet <unitInfo> getUnitInfo {get; set;}
public virtual DbSet <address> getAddress {get; set;}
public virtual DbSet <contact> getPhone {get; set;}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<unitInfo>(entity =>
{
entity.ToTable("unitInfoTbl", "dbo");
entity.HasOne(d => d.address)
.WithOne(a=>a.unitInfoAddress)
.HasForeignKey<unitInfo>(d => d.UnitId);
entity.HasOne(c => c.contact)
.WithOne(a => a.unitInfoContact)
.HasForeignKey<unitInfo>(d => d.UnitId);
});
//The address and contact entities are using the same table
modelBuilder.Entity<address>(entity =>
{
entity.ToTable("unitDetailTbl", "dbo");
});
modelBuilder.Entity<contact>(entity =>
{
entity.ToTable("unitDetailTbl", "dbo");
});
}
}
我尝试在 AddressId 中创建另一个属性作为 FK,并将其在上下文中映射到 unitId。它仍然没有工作,因为它在数据库中期待 unitId1 。我觉得我在模型中混合了注释和 Fluent API。
另一件事,我尝试使用以下注释隐藏地址和联系人实体中的 unitId 属性,但它们都不起作用:
[JsonIgnore]
[ScaffoldColumn(false)]
[Display(AutoGenerateField=false)]