如何首先在代码中创建集群键

划痕

一个人可以有很多同事,而一个同事就是一个人。是否可以在ColleagueId上创建集群键PersonId

好的,我不确定,但是Colleague类仅在那儿,因为数据库应该了解与的连接Person所以,实际上我不需要Colleague上课。我该怎么做,数据库知道该Person列表Colleagues有一个Person

在程序中,我们可以创建Persons,然后应该可以将其他添加PersonsPersons列表中Colleagues

我的解释令人困惑,但我不知道如何以其他任何方式进行解释。

同事班:

public class Colleague
{
    [Key]
    public int ColleagueId { get; set; }

    [Key]
    public virtual Person PersonId { get; set; }
}

人类:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public byte[] Image { get; set; }

    public virtual ICollection<Conversation> Conversations { get; set; }

    public virtual ICollection<Colleague> Colleague { get; set; }


    public Person()
    {
        Conversations = new List<Conversation>();
        Colleague = new List<Colleague>();
    }
}
史蒂文·兰兹

您基本上需要Person实体之间的多对多关系为此,您将需要一个连接Person实体对的联结表如果我们称这个实体为WorkRelationship

class WorkRelationship
{
    [Key]
    [Column(Order = 1)]
    [ForeignKey("Myself")]
    public int MyselfId { get; set; }

    public virtual Person Myself { get; set; }

    [Key]
    [Column(Order = 2)]
    [ForeignKey("Colleague")]
    public int ColleagueId { get; set; }

    public virtual Person Colleague { get; set; }
}

然后我们Person像这样修改

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    [InverseProperty("Myself")]
    public virtual ICollection<WorkRelationship> WorkRelationships { get; set; }

    public void AddWorkRelationship(Person colleague)
    {
        if (WorkRelationships == null)
        {
            WorkRelationships = new List<WorkRelationship>();
        }

        WorkRelationships.Add(new WorkRelationship { Myself = this, Colleague = colleague });
    }
}

因此,您可以看到Person现在有了的集合WorkRelationships:通过向该集合添加一个实体,您不仅可以将此人链接到他/她的同事,还可以创建反向关系。我还添加了一个辅助方法,以便您可以轻松添加关系。

这是一个非常基本的数据库上下文类,可用于管理这些实体:

sealed class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<WorkRelationship> WorkRelationships { get; set; }

    public IEnumerable<Person> GetColleagues(int personId)
    {
        List<WorkRelationship> relationships =
            WorkRelationships
            .Include(x => x.Myself)
            .Include(x => x.Colleague)
            .Where(x => x.MyselfId == personId || x.ColleagueId == personId)
            .ToList();

        foreach (WorkRelationship relationship in relationships)
        {
            if (relationship.Myself.Id == personId)
            {
                yield return relationship.Colleague;
            }
            else if (relationship.Colleague.Id == personId)
            {
                yield return relationship.Myself;
            }
        }
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    }
}

我还为此添加了一个辅助方法,该方法将检索给定人员的同事。

现在,我们可以创建一个简单的测试程序来插入和查询人员:

static void Main(string[] args)
{
    var alice = new Person { Name = "Alice" };
    var bob = new Person { Name = "Bob" };
    var colin = new Person { Name = "Colin" };
    var davina = new Person { Name = "Davina" };

    alice.AddWorkRelationship(bob);
    alice.AddWorkRelationship(colin);

    bob.AddWorkRelationship(davina);

    using (var db = new MyContext())
    {
        db.People.AddRange(new[] { alice, bob, colin, davina });
        db.SaveChanges();
    }

    using (var db = new MyContext())
    {
        Console.WriteLine("Bob works with:");
        foreach (Person colleague in db.GetColleagues(bob.Id))
        {
            Console.WriteLine(colleague.Name);
        }
    }

    Console.ReadLine();
}

以下是原始答案(包含在上下文中)

如果Colleague is是-a Person,那么您应该像这样建模:

public class Colleague : Person
{
    // don't need any other properties based on what you've posted
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public byte[] Image { get; set; }
    public virtual ICollection<Conversation> Conversations { get; set; }
    public virtual ICollection<Colleague> Colleagues { get; set; }
}

(我将用于保存同事集合的属性名称进行了复数处理)。

然后,EF Code First应该创建一个Person带有Discriminator用于区分PersonColleague实体的额外的单个

再考虑一下,我什至不确定您是否需要单独的Colleague实体。您可能会摆脱这种情况:

public class Person
{
    ...
    public virtual ICollection<Person> Colleagues { get; set; }
}

请注意,ICollection<Person>而不是ICollection<Colleague>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何首先在代码中获得具有外键关系的子实体中的父实体属性?

来自分类Dev

如何首先在代码中获得具有外键关系的子实体中的父实体属性?

来自分类Dev

如何首先在Entity Framework代码中创建2个具有相同类型的dbset?

来自分类Dev

如何首先在实体框架6代码中创建可为空的一对多关系

来自分类Dev

首先在实体框架代码中为同一表定义多个外键

来自分类Dev

首先在EF6代码中创建多对多关系

来自分类Dev

首先在Entity Framework代码中链接子表

来自分类Dev

首先在EF代码中删除列

来自分类Dev

首先在Entity Framework代码中链接子表

来自分类Dev

如何首先在实体框架代码中为几个表播种标识种子值

来自分类Dev

如何首先在EF代码中建立模型与枚举之间的多对多关系?

来自分类Dev

EF例外,如何首先在C#和实体框架代码中为地址建模

来自分类Dev

如何首先在实体框架代码中的 linq 中使用可为空列表?

来自分类Dev

如何首先在EF 7代码中使用数据注释指定唯一键

来自分类Dev

首先在实体框架代码中,要映射导航属性是否还需要映射外键列

来自分类Dev

如何首先在代码中定义两个实体之间的多对多和一对多关系?

来自分类Dev

c# - 如何通过实体框架代码的流畅API首先在c#中更改表名?

来自分类Dev

EF代码首先在使用sqlclient provider启动时创建数据库

来自分类Dev

首先在实体框架代码中初始化数据库中的对象

来自分类Dev

如何首先在代码中使用迁移添加计算列?

来自分类Dev

首先在实体框架代码中映射多对多关系

来自分类Dev

首先在MVC 4中使用代码进行数据库迁移

来自分类Dev

首先在EF代码中设计一对多关系的最佳实践

来自分类Dev

在AngularJS中完成Factory方法后,首先在范围内运行代码

来自分类Dev

首先在模型存储库MVC 4代码中验证会话变量

来自分类Dev

如何首先在Firebase中发送电子邮件验证,然后创建帐户?

来自分类Dev

首先在EF代码中进行悲观锁定

来自分类Dev

如何首先在 UI 中显示 JSON 对象中的最后一个属性

来自分类Dev

如何检测哪个并行进程首先在Linux中结束?

Related 相关文章

  1. 1

    如何首先在代码中获得具有外键关系的子实体中的父实体属性?

  2. 2

    如何首先在代码中获得具有外键关系的子实体中的父实体属性?

  3. 3

    如何首先在Entity Framework代码中创建2个具有相同类型的dbset?

  4. 4

    如何首先在实体框架6代码中创建可为空的一对多关系

  5. 5

    首先在实体框架代码中为同一表定义多个外键

  6. 6

    首先在EF6代码中创建多对多关系

  7. 7

    首先在Entity Framework代码中链接子表

  8. 8

    首先在EF代码中删除列

  9. 9

    首先在Entity Framework代码中链接子表

  10. 10

    如何首先在实体框架代码中为几个表播种标识种子值

  11. 11

    如何首先在EF代码中建立模型与枚举之间的多对多关系?

  12. 12

    EF例外,如何首先在C#和实体框架代码中为地址建模

  13. 13

    如何首先在实体框架代码中的 linq 中使用可为空列表?

  14. 14

    如何首先在EF 7代码中使用数据注释指定唯一键

  15. 15

    首先在实体框架代码中,要映射导航属性是否还需要映射外键列

  16. 16

    如何首先在代码中定义两个实体之间的多对多和一对多关系?

  17. 17

    c# - 如何通过实体框架代码的流畅API首先在c#中更改表名?

  18. 18

    EF代码首先在使用sqlclient provider启动时创建数据库

  19. 19

    首先在实体框架代码中初始化数据库中的对象

  20. 20

    如何首先在代码中使用迁移添加计算列?

  21. 21

    首先在实体框架代码中映射多对多关系

  22. 22

    首先在MVC 4中使用代码进行数据库迁移

  23. 23

    首先在EF代码中设计一对多关系的最佳实践

  24. 24

    在AngularJS中完成Factory方法后,首先在范围内运行代码

  25. 25

    首先在模型存储库MVC 4代码中验证会话变量

  26. 26

    如何首先在Firebase中发送电子邮件验证,然后创建帐户?

  27. 27

    首先在EF代码中进行悲观锁定

  28. 28

    如何首先在 UI 中显示 JSON 对象中的最后一个属性

  29. 29

    如何检测哪个并行进程首先在Linux中结束?

热门标签

归档