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