EF 4.3 关系不正确
本文关键字:不正确 关系 EF | 更新日期: 2023-09-27 18:32:05
public class ObjectA
{
public Guid Id {get; set;}
public virtual ObjectB Objectb {get; set;}
}
public class ObjectB
{
public Guid Id {get; set;}
public Guid ObjectAId {get; set;}
public virtual ObjectA ObjectA {get; set;}
}
我没有运气弄好关系。
modelBuilder.Entity<ObjectA>()
.HasRequired(p => p.ObjectB)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
将创建两个关系:
- Object.ObjectA/ObjectA.Id
- ObjectA.Id/ObjectB.Id
如何让 EF 停止创建关系 #2?这是不正确的,也不是我想要的。
错:
modelBuilder.Entity<ObjectA>().HasRequired(x => x.Objectb).WithRequiredPrincipal(x => x.ObjectA);
ALTER TABLE [dbo].[ObjectBs] WITH CHECK ADD CONSTRAINT [FK_ObjectBs_ObjectAs_Id] FOREIGN KEY([Id])
REFERENCES [dbo].[ObjectAs] ([Id])
GO
几乎正确:
modelBuilder.Entity<ObjectA>().HasOptional(x => x.Objectb).WithOptionalPrincipal(x => x.ObjectA);
ALTER TABLE [dbo].[ObjectBs] WITH CHECK ADD CONSTRAINT [FK_ObjectBs_ObjectAs_ObjectA_Id] FOREIGN KEY([ObjectA_Id])
REFERENCES [dbo].[ObjectAs] ([Id])
GO
添加了一列,所以我最终在 ObjectB 中使用了 ObjectAId 和 ObjectA_Id。
modelBuilder.Entity<ObjectA>().HasOptional(x => x.Objectb).WithOptionalPrincipal(x => x.ObjectA).Map(x => x.MapKey("ObjectAId"));
引发异常:类型中的每个属性名称都必须是唯一的。属性名称"ObjectAId"已经定义。
从ObjectB
中删除外键属性:
public class ObjectA
{
public Guid Id {get; set;}
public virtual ObjectB Objectb {get; set;}
}
public class ObjectB
{
public Guid Id {get; set;}
public virtual ObjectA ObjectA {get; set;}
}
并将此映射与 Fluent API 一起使用:
modelBuilder.Entity<ObjectA>()
.HasRequired(a => a.ObjectB)
.WithRequiredPrincipal(b => b.ObjectA)
.WillCascadeOnDelete(false);
需要删除外部属性的原因是 EF 不支持一对一外键关联,而仅支持一对一共享主键关联。
如果您想要一个一对一的外键关联,其中依赖的外键作为唯一键不同于主键,则只有一个解决方法可以将模型映射为一对多关系,而无需在关系的多端和数据库中的唯一约束上具有导航属性, 这样:
public class ObjectA
{
public Guid Id {get; set;}
}
public class ObjectB
{
public Guid Id {get; set;}
public Guid ObjectAId {get; set;}
public virtual ObjectA ObjectA {get; set;}
}
modelBuilder.Entity<ObjectB>()
.HasRequired(b => b.ObjectA)
.WithMany()
.HasForeignKey(b => b.ObjectAId)
.WillCascadeOnDelete(false);
这是按照
Slauma 的建议删除外键属性后最终起作用的方法。
modelBuilder.Entity<ObjectA>()
.HasOptional(x => x.ObjectB)
.WithRequired(x => x.ObjectA)
.Map(x => x.MapKey("ObjectAId"))
.WillCascadeOnDelete(true);
我必须映射属性,否则外键是在主键上创建的。
我想你想要:
modelBuilder.Entity<ObjectA>()
.HasRequired(p => p.ObjectB)
.HasForeignKey(p => p.ObjectAId);
取自 http://msdn.microsoft.com/en-us/data/hh134698