Entity Framework 在不加载的情况下将对象添加到相关实体

Entity Framework add object to related entity without loading

我想将对象添加到相关实体而不加载它们。 我有这样定义的公司实体:

public class Company
{
    public int ID { get; set; }
    public List<Employee> EmployeeList{ get; set; }       

} 

像这样的员工实体

    public class Employee
{
    public int ID { get; set; }
    public String Name{ get; set; }       
} 

我想在不加载所有员工的情况下将员工添加到放置在该公司对象中的列表中。

我知道我可以用这个表达 Company myCompany= systemBD.Companies.Include("EmployeeList").Find(1) myCompany.EmployeeList.Add(newEmployee) 但我担心这会消耗很多时间,因为我的数据库中有数千名员工。

有没有办法在不加载员工列表的情况下向现有公司添加新员工? 我正在研究 Attach 方法,但它似乎不起作用。

        using (var systemDB = new CompanyDB())
        {
            Employee employee = new Employee ();                
            Company companySearch = systemDB.Companies.Where(d => d.Name.Equals("John")).SingleOrDefault();
            if (companySearch != null)
            {
                if (companySearch.EmployeeList != null)
                {
                    systemDB.Companies.Attach(companySearch );
                    companySearch.EmployeeList.Add(employee);
                    systemDB.SaveChanges();

                }

            }

我试过那个代码,但它不起作用。

我认为您需要更改数据库设计才能完成您想要的。

Employee table
    ID (Primary key) 
    Name
Company table
    ID (Primary key) 
    Name
EmployeeCompany table
    IDCompany (Foreign Key)
    IDEmployee (ForeignKey)

这样你就可以完成你想要的

假设您将 Company 和 Employee 实体定义为具有从 Company 到其所有关联 Employees 集合的导航 属性 和从 Employee 到其单个关联 Employees 的 属性公司,您可以完成创建新员工并将其与员工数据库集中的现有公司相关联。

[Table("Company")]
public partial class Company
{
    public Company()
    {
        this.Employees = new HashSet<Employee>();
    }

    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    public virtual ICollection<Employee> Employees { get; set; }
}

[Table("Employee")]
public partial class Employee
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    public int CompanyId { get; set; }

    public virtual Company Company { get; set; }
}

public partial class Database : DbContext
{
    public Database()
        : base("name=Database")
    {
    }

    public virtual DbSet<Company> Companies { get; set; }
    public virtual DbSet<Employee> Employees { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .Property(e => e.Name)
            .IsUnicode(false);

        modelBuilder.Entity<Company>()
            .HasMany(e => e.Employees)
            .WithRequired(e => e.Company)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Employee>()
            .Property(e => e.Name)
            .IsUnicode(false);
    }
}

那么假设你在系统中已经有一个Id为1的Company,你可以这样做:

using (var database = new Database())
{
    var company = database.Companies.Find(1);
    if (company != null)
    {
        var employee = new Employee 
        { 
            Name = "John Doe",
            Company = company
        };

        database.Employees.Add(employee);
        database.SaveChanges();
    }
}

或者...如果您确定公司 ID 1 确实存在...

using (var database = new Database())
{
    var employee = new Employee 
    { 
        Name = "John Doe",
        CompanyId = 1
    };

    database.Employees.Add(employee);
    database.SaveChanges();
}