2015-05-04 65 views
0

我正在学习MVC并坚持创建外键。我一直通过使用其类中的主键的相同名称来创建外键。所以,我有以下简单的模型,具有不同名称的实体框架外键

public class User 
{ 
    [Key] 
    public Guid ID { get; set; } 

    public string Email { get; set; } 

    public string Password { get; set; } 
} 

和LoginHistory的另一种模式是,

public class LoginHistory 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public Guid UserID { get; set; } 

    public DateTime AttemptDateTime { get; set; } 
} 

现在这一部分,我知道,如果我在LoginHistory车型使用用户名,然后它将作为外键被创建。但是如果我想在模型LoginHstory中将该列命名为CustomUser,该怎么办?

我已经检查这个问题, Asp.net mvc entity framework code first associate foreign key with different name

据其回答我的模式将是这样的,如果我想使用不同的名称作为主键,

public class LoginHistory 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public Guid CustomUser { get; set; }  

    [ForeignKey("CustomUser")] 
    public virtual User User { get; set; } 

}

根据上述解决方案,我使用关联和导航属性。如果我只想使用该协会而不使用导航属性怎么办?创建具有不同名称的外键的经验法则是什么?除了选择关联数据之外,还需要导航属性?

流利的api可以让许多事情更容易完成,但我喜欢用Data Annotations来做事情,或者最初我只想完全理解Data Annotations。谢谢

回答

1

如果你想使用数据注释,你所做的完全没问题,你应该有导航属性。

+0

我希望我可以标记两个答案作为答案,但正如你直接回答我的问题,导航属性必须在我的情况下,所以我将这个标记为答案。我的困惑是,我可以使用导航属性独立,但如果使用不同的名称,那么它是必须的。那就是我从你的回答中了解到的。 –

1

如果您不需要导航属性,则无需在删除导航时指定它。 基本上你会直接从EF插入LoginHistory而没有导航属性。没有什么大不了的,但请记住,如果你想使用级联删除左右,那么将需要一个外键。

P.S.我已经删除了所有数据注释,并转移到FluentAPI。这给了我更清洁的模型,我在应用程序中传递。