EF 4.3关系不对

时间:2012-04-24 20:50:08

标签: 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. Object.ObjectA / ObjectA.Id
  2. ObjectA.Id/ObjectB.Id
  3. 如何让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”。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

这是Slauma建议删除外键属性后最终起作用的。

    modelBuilder.Entity<ObjectA>()
    .HasOptional(x => x.ObjectB)
    .WithRequired(x => x.ObjectA)
    .Map(x => x.MapKey("ObjectAId"))
    .WillCascadeOnDelete(true);

我必须映射属性,否则在主键上创建了外键。

答案 2 :(得分:0)

我想你想要:

modelBuilder.Entity<ObjectA>()
    .HasRequired(p => p.ObjectB)
    .HasForeignKey(p => p.ObjectAId);

取自http://msdn.microsoft.com/en-us/data/hh134698