EF 6如何与代理键建立1:M关系

时间:2014-01-21 02:46:37

标签: 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 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应该根据

将CartItem加入购物车
 Cart.RefId = CartItem.CartRefId

默认情况下,EF会尝试加入

Cart.Id == CartItem.CartRefId 

因为Cart.Id是Cart实体的Key。

1 个答案:

答案 0 :(得分:0)

我不认为EF会尝试这个:Cart.Id == CartItem.CartRefId因为类型不一样。因此,如果您需要将Id字段设置为自动增量,则无法映射为没有PK的关系,您可以执行以下操作:

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);
    }
}

如果没有,其他方式可以采用Id PK的默认映射,那么您可以使用连接查询:

    var q = from c in db.Carts
            join i in db.CartItens on c.RefId equals i.CartRefId
            select i;