繁体   English   中英

没有相应属性的实体框架6代码优先外键

[英]Entity Framework 6 Code First Foreign Key Without Corresponding Properties

我有这样的桌子

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

UserSettings
 - UserID (PK)
 - Settings

我的UserSetting实体看起来像这样

public class UserSetting
{
    public UserSetting()
    {
    }

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

    [Required]
    public string Settings { get; set; }
}

我希望UserSettings的PK将用户的UserID的FK添加到UserSettings的UserID的FK,因为这种关系应该是1:1(以防您想知道settings字段是一个字符串,前端只是将它作为json字符串,后端不关心其中的值)

如果我手动创建数据库并添加外键,而EF对此一无所知,则此方法很好用,但我决定尝试让EF为该项目创建数据库。 有没有一种方法可以告诉EF创建FK,而不必为与任何一个实体的关系添加实体属性?

要在Code First中创建关系, 您至少需要在两端之一中具有导航属性 (这种关系称为单向关系)。 典型的一对一关系配置如下:

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导航。 可以将UserId保留在UserSettingId上,而User导航属性足以让Code First创建关系。

为了使EF代码首先自动生成外键关系,您将需要navigation属性。

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

我的实体看起来像这样:

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语句:替换:

.PrimaryKey(t => t.ID);

.PrimaryKey(t => t.ID)
.ForeignKey("dbo.Users", t => t.ID);

不要忘记更改Down方法以包含DropForeignKey语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM