c# - EF 4.3 关系不正确

标签 c# entity-framework entity-framework-4 ef-code-first entity-framework-4.3

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. 对象.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); 

之所以需要移除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/

相关文章:

c# - 处理样本 c#

c# - C# 中的泛型和继承

entity-framework-4 - Entity Framework 4 : PropertyChanged event is raised too often

linq - linq 为存储过程的两次不同执行返回相同的数据?

c# - SaveChanges() 方法不保存对数据库的更改

c# - Entity Framework : how to do correct "Include" on custom type

c# - 是否有用于开发 Entity Framework 4 代码优先的任何好的资源?

c# - 控制台应用程序仅发送 POST 请求中的前 46 个字符

c# - 如何同步对 ASP.NET 中使用的 List<T> 的访问?

c# - 我们怎样才能得到照片的评论