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);
创建了两个关系:
- 对象.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);
之所以需要移除foreign属性,是因为EF不支持一对一外键关联,只支持One-to-One Shared Primary Key Associations .
如果您想要一对一的外键关联,其中依赖项具有外键作为与主键不同的唯一键 there is only a workaround将模型映射为一对多关系,在关系的多方上没有导航属性,并且在数据库中没有唯一约束,如下所示:
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);
关于c# - EF 4.3 关系不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10305788/