【问题标题】:how to setup foreign key relationship in entity framework code first?如何首先在实体框架代码中设置外键关系?
【发布时间】:2016-07-01 14:05:03
【问题描述】:

我有三个实体,用户、域和角色。

我有这个类来定义三个实体的关系:

public class UserDomainRole
{
        [Key]
        public int UserId { get; set; }
        [Key]
        public int DomainId { get; set; }
        [Key]
        public int RoleId { get; set; }
}

那么如何设置 UserDomainRole 和其他三个表之间的外键关系呢? 是这样的吗?

public class DeniedDomainRole
{
    [Key]
    public int UserId { get; set; }
    public virtual User User { get; set; }
    [Key]
    public int DomainId { get; set; }
    public virtual Domain Domain { get; set; }
    [Key]
    public int RoleId { get; set; }
    public virtual Role Role { get; set; }
}

那么实体框架会解决这个关系吗?

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    此代码会给您一个异常消息“无法确定复合主键排序”

    如果你想在代码中创建一个复合主键,那么你必须使用 来给出键/列的顺序,就像这样:

    [Key, Column(Order=1)]
    

    在哪里

    Order = 表上的复合主键/列顺序

    public class UserDomainRole
    {
            [Key, Column(Order=1)]
            public int UserId { get; set; }
    
            [Key, Column(Order=2)]
            public int DomainId { get; set; }
    
            [Key, Column(Order=3)]
            public int RoleId { get; set; }
    }
    

    那么如何设置 UserDomainRole 和其他三个表之间的外键关系呢?是这样的吗?

    这取决于你有什么样的关系:

    • 配置一对零或一关系:

    在这里,我们将配置两个实体之间的一对零或一关系,例如Entity1 可以与 Entity2 的零个或仅一个实例相关联。 http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

    • 配置一对零或一关系:

    在这里,我们将配置两个实体之间的一对零或一关系,例如Entity1 可以与 Entity2 的零个或仅一个实例相关联。 http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

    • 配置多对多关系:

    在这里,我们将学习如何配置 Student 和 Course 实体类之间的多对多关系。学生可以参加多门课程,多名学生可以参加一门课程。 http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

    【讨论】:

    • 嗨,Bassam,意识到现在,我运行命令 Add-Migration AddDeniedDomainRole 并创建了一个包含正确迁移代码的 c# 类。但是,当我运行我的代码时,它给了我这个错误:支持“XXX”上下文的模型自数据库创建以来发生了变化。考虑使用 Code First 迁移来更新数据库。生成迁移代码后,如何使实体框架更新表格?
    • 你必须先调用 update-database 或者使用 ssm 之类的任何工具删除数据库
    • 好的,我试试。你也知道为什么在我的迁移代码中,迁移代码添加了这一行: RenameTable(name: "dbo.DomainRole", newName: "RoleDomain");我认为不需要,所以我在迁移文件中注释掉了这一行,但是,当我尝试查询“无效的对象名称'dbo.RoleDomain'”时出现错误。我试图搜索我的代码,一切仍然使​​用 DomainRole,而不是 RoleDomain?
    • 在问题和数据库上下文中写入所有实体
    • return Db.Roles .AsNoTracking() .Where(r => !r.IsDeleted && r.Users.Any(u => u.UserId == userId) && ((productId == 1 && r.Name.Equals("User Admin", StringComparison.InvariantCultureIgnoreCase)) || r.Domains.Any(d => d.DomainId == domainId))) .Select(r => r.Name) .Distinct( ) .ToList();
    【解决方案2】:

    这样你就可以和用户模型建立关系了

    public int? UserUserId{get;set;}
    public virtual User User{get;set;}
    

    ?使您的外键可以为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多