【发布时间】:2019-05-11 21:02:32
【问题描述】:
我在数据库中有一个简单的结构:
CREATE TABLE user_categories (
user_id INT NOT NULL,
category_id INT NOT NULL,
PRIMARY KEY (user_id, category_id)
);
CREATE TABLE user_defaults (
user_id INT NOT NULL,
category_id INT NOT NULL,
PRIMARY KEY (user_id),
FOREIGN KEY (user_id, category_id) REFERENCES user_categories (user_id, category_id)
);
这里的意图是用户分配了一组类别,并且有一个带有默认表的表(可能还有其他列)
但是我很难将其映射到 EF Core,但我总是在 user_categories 表中获得额外的列。
我的UserCategory 班级:
using System.ComponentModel.DataAnnotations.Schema;
namespace EMMA.Authorization.Domain.Entities
{
public class UserCategory
{
public int UserId { get; set; }
[ForeignKey(nameof(UserId))]
public User User { get; set; }
public int CategoryId { get; set; }
[ForeignKey(nameof(CategoryId))]
public Category Category { get; set; }
public UserDefaults UserDefaults { get; set; }
}
}
UserDefaults
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace EMMA.Authorization.Domain.Entities
{
public class UserDefaults
{
public int UserId { get; set; }
public int CategoryId { get; set; }
public virtual ICollection<UserCategory> UserCategories { get; set; }
}
}
这是应该配置关系的OnModelCreating方法:
modelBuilder.Entity<UserCategory>().HasKey(s => new { s.UserId, s.CategoryId });
modelBuilder.Entity<UserDefaults>().HasKey(s => s.UserId);
modelBuilder.Entity<UserDefaults>()
.HasMany(s => s.UserCategories)
.WithOne(s => s.UserDefaults)
.HasForeignKey(s => new { s.UserId, s.CategoryId })
.IsRequired();
但这是我在尝试创建迁移时遇到的异常:
从 'UserCategory.UserDefaults' 到 'UserDefaults.UserCategories' 与外键属性 {'UserId' : int, 'CategoryId' : int} 的关系不能以主键 {'UserId' : int} 为目标,因为它不是兼容的。为此关系配置一个主键或一组兼容的外键属性。
如何在 EF Core 中配置这样的关系,如 SQL 所示?
【问题讨论】: