rav*_*ven 3 c# sql entity-framework sql-server-ce
我正在使用实体框架来管理我的sql-server-ce数据库.我希望我的表的主键由其他表的几个外键组成.我期待这样的事情发挥作用:
class Bill{
[Key]
public virtual Customer Customer { get; set; }
[Key]
public virtual Era Era { get; set; }
[Key]
public virtual CompanyCode CompanyCode { get; set; }
public long? Amount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但它导致以下数据库迁移错误:
BillPrinter.Bill :: EntityType'Bill'没有定义键.定义此EntityType的键.Bills:EntityType:EntitySet'Bills'基于类型'Bill',没有定义键.
如何让我的表有一个主键由这三个外键组成?
您不能将导航属性用作PK.导航属性提供了一种导航两种实体类型之间关联的方法,但它们本身并不代表关系的FK.您需要明确声明三个附加属性来表示关系的FK,如此模型中所示:
public class Customer
{
public int Id {get;set;}
//...
}
public class Era
{
public int Id {get;set;}
//...
}
public class CompanyCode
{
public int Id {get;set;}
//...
}
public class Bill
{
[Key]
[Column(Order=1)]
[ForeignKey("Customer")]
public int CustomerId {get;set;}
[Key]
[Column(Order=2)]
[ForeignKey("Era")]
public int EraId {get;set;}
[Key]
[Column(Order=3)]
[ForeignKey("CompanyCode")]
public int CompanyCodeId {get;set;}
//...
public virtual Customer Customer { get; set; }
public virtual Era Era { get; set; }
public virtual CompanyCode CompanyCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如您所见,当您有复合键时,Entity Framework要求您定义键属性的顺序.您可以使用Column注释指定订单.此外,您需要使用ForeignKey数据注释来阐明您的意图,哪个导航属性表示它是外键的关系.