C# 首先将外键映射到EF代码中的非主代理键列 公共A类 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共虚拟int-Aid{get;set;} 公共虚拟ICollection B{get;set;} } 公共B级 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共虚拟整数Bid{get;set;} [关键] [第列(顺序=0)] [必需] 公共虚拟字符串BName{get;set} [关键] [第列(顺序=1)] [必需] 公共虚拟int-Aid{get;set;} [外键(“援助”)] 公共虚拟A{get;set;} 公共虚拟ICollection C{get;set;} } 公共C类 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共虚拟int-Cid{get;set;} [关键] [第列(顺序=0)] [必需] 公共虚拟字符串CName{get;set} [关键] [第列(顺序=1)] [必需] 公共虚拟整数Bid{get;set;} [外键(“投标”)] 公共虚拟B{get;set;} }

C# 首先将外键映射到EF代码中的非主代理键列 公共A类 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共虚拟int-Aid{get;set;} 公共虚拟ICollection B{get;set;} } 公共B级 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共虚拟整数Bid{get;set;} [关键] [第列(顺序=0)] [必需] 公共虚拟字符串BName{get;set} [关键] [第列(顺序=1)] [必需] 公共虚拟int-Aid{get;set;} [外键(“援助”)] 公共虚拟A{get;set;} 公共虚拟ICollection C{get;set;} } 公共C类 { [数据库生成(DatabaseGeneratedOption.Identity)] 公共虚拟int-Cid{get;set;} [关键] [第列(顺序=0)] [必需] 公共虚拟字符串CName{get;set} [关键] [第列(顺序=1)] [必需] 公共虚拟整数Bid{get;set;} [外键(“投标”)] 公共虚拟B{get;set;} },c#,entity-framework,ef-code-first,foreign-keys,entity-framework-6,C#,Entity Framework,Ef Code First,Foreign Keys,Entity Framework 6,B和C之间的关系让我很困扰。我不想在C类中包含BName作为外键 错误:从属角色和主体角色中的属性数 在关系中,约束必须相同 我理解错误,但我想指出C类仅通过Bid,我如何在不干扰A和B之间关系的情况下实现它。据我所知,在EF代码中首先使用属性或fluent api是不可能的 但是我可以建议您重新设计一下您的解决方案-不要在B(BName,Aid)上创建主键-使其成为唯一索引- 公共B类 { [关键] [数据库生成(DatabaseGeneratedOption.Identit

B和C之间的关系让我很困扰。我不想在C类中包含BName作为外键

错误:从属角色和主体角色中的属性数 在关系中,约束必须相同


我理解错误,但我想指出C类仅通过Bid,我如何在不干扰A和B之间关系的情况下实现它。

据我所知,在EF代码中首先使用属性或fluent api是不可能的

但是我可以建议您重新设计一下您的解决方案-不要在
B(BName,Aid)
上创建主键-使其成为唯一索引-

公共B类
{    
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共虚拟整数Bid{get;set;}
[索引(“IX_B_Name_Aid”,1,IsUnique=true)]
[必需]
公共虚拟字符串BName{get;set}
[索引(“IX_B_Name_Aid”,2,IsUnique=true)]
[必需]
公共虚拟int-Aid{get;set;}
[外键(“援助”)]
公共虚拟A{get;set;}
公共虚拟ICollection C{get;set;}
}
公共C类
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共虚拟int-Cid{get;set;}
[关键]
[第列(顺序=0)]
[必需]
公共虚拟字符串CName{get;set}
[关键]
[第列(顺序=1)]
[必需]
公共虚拟整数Bid{get;set;}
[外键(“投标”)]
公共虚拟B{get;set;}
}
该索引将为您提供与主键相同的查询性能优势(尽管在
Bid
列上支持主索引会带来一些额外的开销)


另外,推荐阅读-。

此问题标记为EF6。但如果你发现这个搜索EF核心。可以用

从链接:

备用键可以用作关系的目标

class MyContext:DbContext
{
公共数据库集博客{get;set;}
公共DbSet Posts{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasOne(p=>p.Blog)
.有许多(b=>b.职位)
.HasForeignKey(p=>p.BlogUrl)
.HasPrincipalKey(b=>b.Url);
}
}
公共类博客
{
public int BlogId{get;set;}
公共字符串Url{get;set;}
公共列表发布{get;set;}
}
公营职位
{
公共int PostId{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
公共字符串BlogUrl{get;set;}
公共博客Blog{get;set;}
}
public class A    
{   
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int Aid { get; set; }    

    public virtual ICollection<B> B { get; set; }    
}


public class B
{    
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]     
    public virtual int Bid { get; set; }

    [Key]
    [Column(Order = 0)]
    [Required]           
    Public virtual string BName {get ; set}

    [Key]
    [Column(Order = 1)]
    [Required]      
    public virtual int Aid { get; set; }

    [ForeignKey("Aid")]
    public virtual  A A { get; set; }

    public virtual ICollection<C> C { get; set; }    
}


public class C
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]     
    public virtual int Cid { get; set; }

    [Key]
    [Column(Order = 0)]
    [Required]    
    Public virtual string CName {get ; set}    

    [Key]
    [Column(Order = 1)]
    [Required]          
    public virtual int Bid { get; set; }

     [ForeignKey("Bid")]
     public virtual  B B { get; set; } 
}
public class B
{    
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]     
    public virtual int Bid { get; set; }

    [Index("IX_B_Name_Aid", 1, IsUnique = true)]
    [Required]           
    Public virtual string BName {get ; set}

    [Index("IX_B_Name_Aid", 2, IsUnique = true)]
    [Required]      
    public virtual int Aid { get; set; }

    [ForeignKey("Aid")]
    public virtual  A A { get; set; }

    public virtual ICollection<C> C { get; set; }    
}


public class C
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]     
    public virtual int Cid { get; set; }

    [Key]
    [Column(Order = 0)]
    [Required]    
    Public virtual string CName {get ; set}    

    [Key]
    [Column(Order = 1)]
    [Required]          
    public virtual int Bid { get; set; }

    [ForeignKey("Bid")]
    public virtual  B B { get; set; } 
}
class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogUrl)
            .HasPrincipalKey(b => b.Url);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public string BlogUrl { get; set; }
    public Blog Blog { get; set; }
}