如何获得实体框架代码第一个和可以为空的外键属性工作?

b3n*_*b3n 10 .net c# entity-framework-4 ef-code-first

我正在尝试创建一个简单的实体框架代码第一个应用程序.我有这些课程:

public class User
{
    public int UserId { get; set; }

    public string Username { get; set; }

    public virtual ActivationTicket ActivationTicket { get; set; }
}

public class ActivationTicket
{
    public int ActivationTicketId { get; set; }

    public virtual User User { get; set; }

    public string Ticket { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试创建一个新用户并将其保存到数据库(没有ActivationTicket的用户)时,我收到一个异常

INSERT语句与FOREIGN KEY约束"ActivationTicket_User"冲突.冲突发生在数据库"Test",表"dbo.ActivatioTickets",列'ActivationTicketId'中.该语句已终止.

我假设EF将User和ActivationTicket之间的映射视为1-1,但它应该是1-0..1

我该怎么做才能让它发挥作用?

ano*_*non 21

您将需要这样的映射规则:

modelBuilder
    .Entity<User>()
    .HasOptional<ActivationTicket>(u => u.ActivationTicket)
    .WithOptionalPrincipal();

这将为您提供一个可以为空的UserId的ActivationTickets表.

  • 你有两个选择.1)直接将它放在从DbContext派生的类的方法中:protected override void OnModelCreating(ModelBuilder modelBuilder) - 或者 - 2)使用modelBuilder.Configurations.Add(new ...)在单独的类中定义映射 (2认同)

Leo*_*ber 5

@ b3n这应该足够了,至少在VS 2013中:

public class User
{
   public int UserId { get; set; }

   public string Username { get; set; }

   public int? ActivationTicketId { get; set;}

   public virtual ActivationTicket ActivationTicket { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是重要的部分:

public int? ActivationTicketId { get; set;}
Run Code Online (Sandbox Code Playgroud)

这将在ActivasionTicket的"User"表中指定foreignkey,并定义它是可选的.

学分转到:http://forums.asp.net/t/1948351.aspx?更改+ 外语+关键词+不可导致+使用+代码+第一 栏#5554732

我有同样的问题,它立即为我工作.

另外作为注释,我用数据注释"[Key]"标记了所有主键.这可能是必要的,以使这项工作.