EF代码首先一个到(一个或零),字符串作为主键

时间:2017-09-03 18:32:01

标签: c# entity-framework ef-code-first one-to-one ef-fluent-api

当我尝试将这两个类链接到数据结构时,我不断收到错误。一个字符串作为主键,另一个字符串长。我已经尝试了数据注释和其他各种各样的东西。

Fluent API或数据注释是可以接受的。

以下是一个类的示例:

public class X
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long Id { get; set; }

    public string Token { get; set; }
    public virtual Y Y { get; set; }
}

这是另一个类:

public class Y
{
    [Key, StringLength(64), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Token { get; set; }

    public long XId { get; set; }
    public virtual X X{ get; set; }
}

这是我在OnModelCreating()中尝试定义fkeys的地方:

modelBuilder.Entity<X>()
            .HasOptional(u => u.Y)
            .WithRequired(u => u.X)
            .Map(m => m.MapKey("Token"));

modelBuilder.Entity<Y>()
            .HasRequired(u => u.X)
            .WithOptional(u => u.Y)
            .Map(m => m.MapKey("XId"));

1 个答案:

答案 0 :(得分:2)

public class X
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long Id { get; set; }

    // you don't need Token here...
    //public string Token { get; set; }

    [InverseProperty("X")]
    public virtual Y Y { get; set; }
}

public class Y
{

    [Key, Column(Order=1)]
    public long XId {get;set;}

    [Index(Unique = true), StringLength(64)] 
    public string Token { get; set; }

    [ForeignKey("XId")]
    [InverseProperty("Y")]
    public virtual X X{ get; set; }
}