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之间的关系的情况下实现它。
发布于 2019-05-16 07:05:06
此问题已标记为EF6。但是如果你在搜索EF Core的时候发现。可以使用Alternate Keys。
发自链接:
备用关键字可以用作关系的目标。
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; }
}
发布于 2016-06-25 23:09:04
据我所知,不可能在EF代码中先用属性或fluent api来做这件事:
但我可以建议您稍微修改一下解决方案--不要在B(BName, Aid)
上创建主键--让它成为唯一的索引-- Unique Key constraints for multiple columns in Entity Framework。
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。
https://stackoverflow.com/questions/38029313
复制相似问题