首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >首先将外键映射到EF代码中的非主代理键列

首先将外键映射到EF代码中的非主代理键列
EN

Stack Overflow用户
提问于 2016-06-25 22:02:19
回答 2查看 13.5K关注 0票数 11
代码语言:javascript
复制
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; } 
}

B和C之间的关系困扰着我.I不想将BName作为外键包含在C类中

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-05-16 07:05:06

此问题已标记为EF6。但是如果你在搜索EF Core的时候发现。可以使用Alternate Keys

发自链接:

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

代码语言:javascript
复制
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; }
}
票数 14
EN

Stack Overflow用户

发布于 2016-06-25 23:09:04

据我所知,不可能在EF代码中先用属性或fluent api来做这件事:

但我可以建议您稍微修改一下解决方案--不要在B(BName, Aid)上创建主键--让它成为唯一的索引-- Unique Key constraints for multiple columns in Entity Framework

代码语言:javascript
复制
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; } 
}

索引将为您提供与主键相同的查询性能优势(不过在支持Bid列上的主surrogate索引时会有一些额外的开销)。

另外,推荐阅读- Surrogate vs. natural/business keys

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38029313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档