【问题标题】:Do I need to explicitly add a property int to foreign keys for composed objects using Entity Framework?我是否需要使用实体框架将属性 int 显式添加到组合对象的外键?
【发布时间】:2019-10-14 03:45:36
【问题描述】:

我是否需要为使用 Entity Framework 的每个外键对象添加一个整数 PropertyId,在示例中为 UserId? NHibernate 会自动处理这个问题,我想知道是否有任何方法可以解决这个问题,只使用对象而不是每次添加新寄存器时都从数据库中检索它。

我尝试了插入,只是定义:

// It's complaining about required user fields
var newMenu = new Menu { Name = "test", User = new User { Id = 1 }};

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

    [Required]
    [MaxLength(100)]
    public string Name { get; set; }

    [Required]
    [MaxLength(100)]
    public string Email { get; set; }

    [Required]
    [MaxLength(30)]
    public string Password { get; set; }

    [Required]
    public bool Active { get; set; }
}

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

    [Required]
    [MaxLength(100)]
    public string Name { get; set; }

    [Required]
    public User User { get; set; }

    [Required]
    public bool Active { get; set; }
}

【问题讨论】:

  • 如果没有这样的属性,你将如何编写一个查询来通过用户 ID 获取所有菜单?
  • menus.Where(m => m.User.Id == 1);
  • 这是否意味着对菜单的查询将始终加载并包含相关的用户数据?
  • 在这种情况下是的,但即使它不是非空字段,我也可以使用menus.Where(m => m.User?.Id == 1); 而不会出现错误

标签: c# .net entity-framework asp.net-core


【解决方案1】:

在 EF 中,你必须显式定义外键并使用 ForeignKey 属性来指定关系

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

    [Required]
    [MaxLength(100)]
    public string Name { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set;}

    [Required]
    public User User { get; set; }

    [Required]
    public bool Active { get; set; }
}

【讨论】:

  • 我意识到了这一点,但我想知道是否有任何方法可以在没有额外的 int 属性的情况下使用它
  • 不,我认为在 EF 中无论如何都不会这样做
【解决方案2】:
//create or retrieve the user that has to be linked to menu from the database
User u = users.Where(user => user.Id == 1); // example

var newMenu1 = new Menu{ Name = "test", User = u };
var newMenu2 = new Menu{ Name = "test2", User = u };

然后您可以保存更改。您只使用用户对象。 那是你需要的吗?

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多