gpt4 book ai didi

c# - EF 4.3 关系不正确

转载 作者:行者123 更新时间:2023-11-30 21:07:35 25 4
gpt4 key购买 nike

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);

创建了两个关系:

  1. Object.ObjectA/ObjectA.Id
  2. 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 不支持一对一外键关联,而只支持 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com