【问题标题】:How to create the foreign key in the parent table and assign it to the child table using entity framework in asp.net mvc如何使用asp.net mvc中的实体框架在父表中创建外键并将其分配给子表
【发布时间】:2018-03-26 20:47:11
【问题描述】:

我正在使用带有实体框架的 asp.net mvc 开发一个网站。我有一个现有的数据库,关系如下所示。

父表:

public class Accounts
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public int AddressId { get; set; }

    public virtual Addresses Address { get; set; }

    //Other properties...
}

子表:

 public class Addresses
 {
    [Key, ForeignKey("Account")]
    public int AddressId { get; set; }

    public virtual Accounts Account { get; set; }

    //Other properties...
 }

//创建用户逻辑:

public void CreateUser(UserModel model)
{
        Addresses newAddress = new Addresses()
        {
            ShippingFirstName = "1",
            ShippingLastName = "1",
            ShippingAddress = "1",
            ShippingAddress2 = "1",
            ShippingCity = "1",
            ShippingState = "1",
            ShippingZip = "1",
            ShippingCountry = "1",
            ShippingPhone = "1",
        };

        Accounts newAccount = new Accounts
        {
            UserFirstName = "a",
            UserLastName = "a",
            UserEmail = model.UserEmail,
            UserPassword = model.UserPassword,
            AddressId = 1,
            UserType = "User",
            Address = newAddress
        };
        context.Accounts.Add(newAccount);
        context.SaveChanges();
}

当我使用 CreateUser 函数创建新用户时,Addresses 表中的 AddressId(primary key) 与数据插入数据库后 Accounts 表中的 AccountId(primary key, identity column) 相同,这意味着实体框架使用 UserId 作为外键并将其分配给 Addresses 表。但是,在我的数据库中,外键是 Accounts 表中的 AddressId,并指向 Addresses 表中的 AddressId。

问题:

  1. 我在实体类中设置的关系是否正确?

  2. 如何告诉实体框架它应该使用 Accounts 表中的 AddressId 作为外键,并在 context.Accounts.Add(newAccount) 和 context.SaveChanges( )?

  3. 我应该如何在 Accounts 表中生成外键(AddressId)?

【问题讨论】:

    标签: c# mysql asp.net asp.net-mvc entity-framework


    【解决方案1】:

    [ForeignKey("Account")] 使AddressId 获取Accounts 的主键,即UserId

    拆分:

    public class Addresses
    {
        [Key]
        public int AddressId { get; set; }
    
        [ForeignKey("Account")]            // Not necessary
        public int AccountId { get; set; } // Necessary
    
        public virtual Accounts Account { get; set; }
    
        // Other properties...
    }
    

    您应该在实体中设置主键:

    public void CreateUser(UserModel model)
    {
        Addresses newAddress = new Addresses()
        {
            ShippingFirstName = "1",
            ShippingLastName = "1",
            ShippingAddress = "1",
            ShippingAddress2 = "1",
            ShippingCity = "1",
            ShippingState = "1",
            ShippingZip = "1",
            ShippingCountry = "1",
            ShippingPhone = "1",
            AddressId = 1 // Set primary key
        };
    
        // ...
    }
    

    【讨论】:

    • 嗨@aaron,在Accounts 表中已经有一个外键(AddressId) 指向Addresses 表中的主键。是否可以在 Addresses 表中不创建新属性(AccountId)的情况下做到这一点?我在 Accounts 表上设置了 on delete 级联。如果帐户被删除,关联的地址也会被删除。
    • 如果你想要Addresses中的导航属性Account,你需要一个单独的AccountId。或者,您可以拥有不需要外键的逆属性 ICollection<Accounts>
    • 在我删除 Addresses 表中的 Account 导航属性并在 Accounts 表中的 AddressId 上设置 [ForeignKey("Address")] 后,实体框架不会自动从 Accounts 分配 AddressId表到 Addresses 表中的 AddressId。这是怎么回事?它给了我一个例外,并说 Addresses 表中的 AddressId 不能为空。
    • 这就是我想做的。如果我将 Accounts 表中的 AddressId 设置为 100,我希望在保存帐户对象时自动将 Addresses 中的 AddressId(primary key) 设置为 100。
    • 你看我的回答了吗? 您应该在实体中设置主键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多