实体框架核心-外键为NULL



我有User和Customer表。User表的PK为Username,是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(为空。我该如何修复它?

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

文件:https://learn.microsoft.com/en-us/ef/ef6/fundamentals/relationships

修复类

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);

IMHO您必须添加整数Id作为用户表的键。没有这个User表看起来非常激进,EF也很困惑。您将无法轻易更改用户名,因为它是一个主键。也许你将不得不添加一些流畅的API以及

我通过正确定义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; } 
}

最新更新