我正在尝试对现有的数据库使用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。
答案 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;