Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF 6如何使用代理键设置1:M关系_C#_Sql_Entity Framework - Fatal编程技术网

C# EF 6如何使用代理键设置1:M关系

C# EF 6如何使用代理键设置1:M关系,c#,sql,entity-framework,C#,Sql,Entity Framework,我正在尝试对现有数据库使用EF6(首先通过代码)。基础数据库中没有FK。实体由标识pk定义,但也可以由代理项值(RefId)引用 假设我有: public class Cart { public int Id { get; set; } // PK public string RefId { get; set; } public virtual List<CartItem> CartItems { get; set; } } public class Ca

我正在尝试对现有数据库使用EF6(首先通过代码)。基础数据库中没有FK。实体由标识pk定义,但也可以由代理项值(RefId)引用

假设我有:

public class Cart
{
    public int Id { get; set; } // PK
    public string RefId { get; set; }
    public virtual List<CartItem> CartItems { get; set; }

}

public class CartItem
{
    public int Id { get; set; } // PK
    public string RefId { get; set; }
    public string CartRefId {get;set;}

    public virtual Cart Cart { get; set; }
 }

public class CartMap : EntityTypeConfiguration<Cart>
{
    public CartMap()
    {
        HasKey(t => t.Id);
    }
}

public class CartItemMap : EntityTypeConfiguration<CartItem>
{
    public CartItemMap()
    {
        HasKey(t => t.Id);

        HasRequired(t => t.Cart)
            .WithMany(t => t.CartItems)
            .HasForeignKey(t => t.CartRefId);
    }
}
默认情况下,EF将尝试加入

Cart.Id == CartItem.CartRefId 

因为Cart.Id是购物车实体的键

我认为EF不会尝试这样做:Cart.Id==CartItem.CartRefId,因为类型不同。因此,不可能映射到没有PK的关系,如果需要将Id字段自动递增,可以执行以下操作:

public class Cart
{
    public int Id { get; set; }
    public string RefId { get; set; } // PK
    public virtual List<CartItem> CartItems { get; set; }

}

public class CartItem
{
    public int Id { get; set; } 
    public string RefId { get; set; } // PK
    public string CartRefId { get; set; }

    public virtual Cart Cart { get; set; }
}

public class CartMap : EntityTypeConfiguration<Cart>
{
    public CartMap()
    {
        HasKey(t => t.RefId);
        Property(i => i.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

public class CartItemMap : EntityTypeConfiguration<CartItem>
{
    public CartItemMap()
    {
        HasKey(t => t.RefId);
        Property(i => i.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(t => t.Cart)
            .WithMany(t => t.CartItems)
            .HasForeignKey(t => t.CartRefId);
    }
}
public class Cart
{
    public int Id { get; set; }
    public string RefId { get; set; } // PK
    public virtual List<CartItem> CartItems { get; set; }

}

public class CartItem
{
    public int Id { get; set; } 
    public string RefId { get; set; } // PK
    public string CartRefId { get; set; }

    public virtual Cart Cart { get; set; }
}

public class CartMap : EntityTypeConfiguration<Cart>
{
    public CartMap()
    {
        HasKey(t => t.RefId);
        Property(i => i.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

public class CartItemMap : EntityTypeConfiguration<CartItem>
{
    public CartItemMap()
    {
        HasKey(t => t.RefId);
        Property(i => i.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(t => t.Cart)
            .WithMany(t => t.CartItems)
            .HasForeignKey(t => t.CartRefId);
    }
}
    var q = from c in db.Carts
            join i in db.CartItens on c.RefId equals i.CartRefId
            select i;