1

我是实体框架的新手,我可能有一个简单的问题。

我最大程度地简化了结构以使其清晰(我希望如此)。

想象一下,我只需要创建一个简单的“企业”类,只有一个名称。然后另一个名为“Worker”的类也只有一个工人的名字。一个工人应该属于一个企业。企业必须有经理(工人)。

所以这就是我想象这些简单类的方式:

public class Worker
{
    public int WorkerId { get; set; }
    public String Name { get; set; }

    public int EnterpriseId { get; set; } // ForeignKey for Enterprise
    public Enterprise Enterprise { get; set; }
}

public class Enterprise
{
    public int EnterpriseId { get; set; }
    public String Name { get; set; }

    public Worker Manager { get; set; }
    public List<Worker> Workers { get; set; }
}

我希望这些类产生以下数据库结构:

Table Worker
    WorkerId (PK, int, not null)
    Name (varchar(128), not null)
    EnterpriseId (FK, int)

Table Enterprise
    EnterpriseId (PK, int, not null)
    Name (varchar(128), not null)
    Manager (FK, int)

我用modelBuilder尝试了很多东西,但我从来没有得到我想要的东西。是否有使用 Fluent API 的解决方案来做我想做的事情?

非常感谢您的帮助。

4

2 回答 2

0

我不知道您打算如何获得管理器对象,但我猜您需要使用它Inheritance来使您的设计达到最佳状态。试试这个:

public abstract class Employee
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int EmployeeId{ get; set; }

    public String Name { get; set; }

    [ForeignKey("Enterprise"), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int EnterpriseId { get; set; } // ForeignKey for Enterprise

    public Enterprise Enterprise { get; set; }
}

[Table("Workers")] // Table per Type (TPT), This will be your Table name in your database
public class Worker : Employee
{
   //Add properties only related to workers
}

[Table("Managers")] // Table per Type (TPT). This will be your Table name in your database
public class Manager : Employee
{
   //Add properties only related to Managers
}

public class Enterprise
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int EnterpriseId { get; set; }
   public String Name { get; set; }

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

注意:抱歉,这是使用Property Mapping

链接这是一个简单的流利映射示例的链接

链接在此处阅读有关每种类型的表 (TPT) 继承的信息

于 2013-04-09T22:36:17.723 回答
0

这不会让你得到你想要的(在 Db 中) -但这是我推荐的......

public ICollection<Worker> Workers { get; set; } // instead of List<>
// ...
modelBuilder.Entity<Worker>()
    .HasRequired(x => x.Enterprise)
    .WithMany(x => x.Workers)
    .HasForeignKey(x => x.EnterpriseId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Enterprise>()
    .HasOptional(x => x.Manager)
    .WithOptionalPrincipal() // x => x.DefaultForEntity)
    .WillCascadeOnDelete(false);

你可以像这样使用它:

var enterprise = new Enterprise { Manager = new Worker { Name = "Manager", }, };
enterprise.Workers = new[]
{
    enterprise.Manager,
    new Worker{ Name = "Worker1", },
    new Worker{ Name = "Worker2", },
    new Worker{ Name = "Worker3", },
    new Worker{ Name = "Worker4", },
    new Worker{ Name = "Worker5", },
};
db.Enterprises.Add(enterprise);
db.SaveChanges();
var enterprises = db.Enterprises.ToList();

这正是你想要的......

modelBuilder.Entity<Worker>()
    .HasRequired(x => x.Enterprise)
    .WithMany(x => x.Workers)
    .HasForeignKey(x => x.EnterpriseId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Enterprise>()
    .HasKey(x => x.EnterpriseId);

modelBuilder.Entity<Enterprise>()
    .HasOptional(x => x.Manager)
    .WithOptionalDependent() // x => x.DefaultForEntity)
    .WillCascadeOnDelete(false);

...但将不起作用- 由于周期性引用(EF 错误)。

这是一个类似/相同解决方案的非常详细的示例...

实体框架一对多与默认

于 2013-04-09T23:56:56.873 回答