C# EF 6如何使用代理键设置1:M关系
我正在尝试对现有数据库使用EF6(首先通过代码)。基础数据库中没有FK。实体由标识pk定义,但也可以由代理项值(RefId)引用 假设我有: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
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;