Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6编码没有相应属性的第一个外键_C#_Entity Framework - Fatal编程技术网

C# 实体框架6编码没有相应属性的第一个外键

C# 实体框架6编码没有相应属性的第一个外键,c#,entity-framework,C#,Entity Framework,我有这样的桌子 Users - UserID (PK) - UserName - ... UserSettings - UserID (PK) - Settings public class UserSetting { public UserSetting() { } [Key] [Column("UserID", TypeName ="nvarchar(128)")] public string ID { get; set; }

我有这样的桌子

Users
 - UserID (PK)
 - UserName
 - ...

UserSettings
 - UserID (PK)
 - Settings
public class UserSetting
{
    public UserSetting()
    {
    }

    [Key]
    [Column("UserID", TypeName ="nvarchar(128)")]
    public string ID { get; set; }

    [Required]
    public string Settings { get; set; }
}
我的UserSetting实体如下所示

Users
 - UserID (PK)
 - UserName
 - ...

UserSettings
 - UserID (PK)
 - Settings
public class UserSetting
{
    public UserSetting()
    {
    }

    [Key]
    [Column("UserID", TypeName ="nvarchar(128)")]
    public string ID { get; set; }

    [Required]
    public string Settings { get; set; }
}
我希望UserSettings的PK将FK从Users中的UserID添加到UserSettings中的UserID,因为关系应该是1:1(如果您想知道settings字段是一个字符串,前端只是将其作为json字符串转储到数据库中,后端不关心其中的值)


如果我手动创建数据库并添加外键,而EF对此一无所知,那么这就很好了,但我决定尝试让EF为这个项目创建DB。有没有一种方法可以告诉EF在不添加实体属性的情况下创建该FK?

要在代码中首先创建关系,您需要在两端中至少有一个导航属性(这种关系称为单向关系)。典型配置如下所示:

public class User
{
    public User()
    {
    }

    [Key]
    [Column("ID", TypeName ="nvarchar(128)")]
    public string ID { get; set; }

    public string Name{ get; set; }

    public virtual UserSetting UserSetting {get;set;} 
}

public class UserSetting
{
    public UserSetting()
    {
    }

    [Key,ForeignKey("User"),Column("UserID")]
    public string ID { get; set; }

    //...

    public virtual User User{get;set;}
}
现在,使用这个模型,您不会向表中添加任何新列,它将是相同的,只是现在您正在将
UserSettings
表的PK配置为关系的FK(您正在尝试实现的)


现在,正如我所说,EF需要至少一个导航属性来创建关系。因此,如果需要,可以删除
UserSetting
nav。属性,这样就可以了,将数据注释保留在
UserSetting
Id
User
导航属性上,这样就可以先编码来创建关系。

对于EF code First自动生成外键关系,您需要导航属性

我发现解决这个问题的最简单方法是手动更改迁移

我的实体如下所示:

public class User
{
    public User() { }

    [Key]
    public string ID { get; set; }

    public string Name { get; set; }
}

public class UserSetting
{
    public UserSetting() { }

    [Key]
    public string ID { get; set; }

    public string Settings { get; set; }
}
执行迁移,这将生成以下迁移类:

...
        CreateTable(
            "dbo.Users",
            c => new
                {
                    ID = c.String(nullable: false, maxLength: 128),
                    Name = c.String(),
                })
            .PrimaryKey(t => t.ID);

        CreateTable(
            "dbo.UserSettings",
            c => new
                {
                    ID = c.String(nullable: false, maxLength: 128),
                    Settings = c.String(),
                })
            .PrimaryKey(t => t.ID);
...
现在更改与UserSetting表相关的CreateTable语句: 替换:


别忘了更改Down方法以包含DropForeignKey语句。

谢谢。我想如果我把UserSetting属性保留为虚拟的,我可能会不使用它。尽管如此,这仍然令人恼火。我不希望数据库中只有关系引用完整性。我已经通过使用您的示例逐字进行了尝试,并得到“序列不包含匹配元素”。我做错了什么?