实体框架核心 - 外键为 NULL

时间:2021-06-18 14:37:42

标签: c# sql entity-framework-core

我有 User 和 Customer 表。 User 表具有 Username 的 PK,并且是 Customer 表中的 FK。 我想将客户和用户输入的详细信息添加到数据库中,用户的用户名(主键)是客户表中的外键

关于为什么客户表中的用户名(FK)为空的问题

用户:

public class User
{
    [Key]
    public string Username { get; set; }
    public string Password { get; set; }
}

客户:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

    public User User { get; set; }
}

DBContext:

class StoreContext : DbContext
{
    readonly string connectionString = @"Data source=...;Integrated security=true;Initial Catalog=dbPizzaOrderingV1";

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString);
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        
    }

}

管理客户:

class ManageCustomer
{
    StoreContext context;
    public ManageCustomer()
    {
        context = new StoreContext();
    }
    public bool AddUser(User user)
    {
        context.Users.Add(user);
        context.SaveChanges();
        return true;
    }
    public bool AddCustomer(Customer customer)
    {
        context.Customers.Add(customer);
        context.SaveChanges();
        return true;
    }

计划:

 public void CreateAccount()
 {
    Customer customer = new Customer();
    User user = new User();
    Console.WriteLine("Create Account");
    Console.WriteLine("Enter Your Name: ");
    customer.Name = Console.ReadLine();
    Console.WriteLine("Enter Username: ");
    user.Username = Console.ReadLine();
    Console.WriteLine("Enter Password: ");
    user.Password = Console.ReadLine();

    manageCustomer.AddUser(user);
    manageCustomer.AddCustomer(customer);
        
    Console.WriteLine("Created Account Successfully!");
 }

用户详细信息和客户详细信息成功添加到表中,但客户表中的用户名(FK)为空。 我该如何解决?

3 个答案:

答案 0 :(得分:0)

public string UserId { get; set; } 添加到 Customer 类。而 User 属性必须是 virtual

文档:https://docs.microsoft.com/en-us/ef/ef6/fundamentals/relationships

答案 1 :(得分:0)

修复类

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

     public string Username { get; set; }

    [ForeignKey(nameof(UserName))]
    [InverseProperty("Customers")]
    public virtual User User { get; set; }
}
public class User
{
    [Key]
    public string Username { get; set; }
    public string Password { get; set; }

    [InverseProperty(nameof(Customer.User))]
    public virtual ICollection Customers {get; set;}
}

和代码

//customer.UserName=user.UserName;
customer.User =user;  
 manageCustomer.AddCustomer(customer);

或者你也可以试试这个

 manageUser.AddUser(user);
customer.UserName=user.UserName;
 manageCustomer.AddCustomer(customer);

恕我直言,您必须添加整数 Id 作为用户表的键。没有这个 User 表看起来很奇怪,EF 很困惑。您将无法轻松更改用户名,因为它是主键。也许你还需要添加一些流畅的 API

答案 2 :(得分:0)

我通过正确定义Username的外键解决了问题

 class User
   {
        [Key]
        public string Username { get; set; }
        public string Password { get; set; }
        public virtual Customer Customer{ get; set; }
   }

 class Customer
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public string Username { get; set; }

        [ForeignKey(nameof(Username))]
        public virtual User User { get; set; } 
    }