Entity framework 如何在EntityFramework5中映射组件列表?
我是NHibernate用户,NHibernate允许我创建一个非常细粒度的模型。 我正在将一个应用程序从NHibernate移植到实体框架 NHibernate允许我定义以下内容:Entity framework 如何在EntityFramework5中映射组件列表?,entity-framework,entity-framework-5,Entity Framework,Entity Framework 5,我是NHibernate用户,NHibernate允许我创建一个非常细粒度的模型。 我正在将一个应用程序从NHibernate移植到实体框架 NHibernate允许我定义以下内容: public class User : DomainEntity { public virtual Name Name { get; set; } ... public virtual ICollection<LogonInformation> LogonInformations
public class User : DomainEntity
{
public virtual Name Name { get; set; }
...
public virtual ICollection<LogonInformation> LogonInformations { get; set; }
}
public class Name
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class LogonInformation
{
public virtual string Ip { get; set; }
public virtual DateTime Date { get; set; }
}
公共类用户:域实体
{
公共虚拟名称{get;set;}
...
公共虚拟ICollection LogonInformations{get;set;}
}
公共类名
{
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
}
公共类标识信息
{
公共虚拟字符串Ip{get;set;}
公共虚拟日期时间日期{get;set;}
}
其中名称和LogonInformation映射为您的例外情况是抱怨
登录信息
没有主键。为了建立主键,您将属性key
添加到要作为主键的属性中,例如,如果Ip
是您的主键,您的代码将是:
public class LogonInformation
{
[Key]
public virtual string Ip { get; set; }
public virtual DateTime Date { get; set; }
}
更新: 如果您无法更改
登录信息
,则可以使用Fluent API设置其主键(我不喜欢这种方式,但它可以解决您的问题)。为此,您需要在上下文中重写OnModelCreating
方法,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<LogonInformation>().HasKey(logInfo => logInfo.Ip);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasKey(logInfo=>logInfo.Ip);
}
我不能像NHibernate那样告诉EF在“启动”期间添加UserId列吗?我无法更改LogonInformation类。@cidico:我不知道NHibernate,但在EF代码中,首先设置主键属性的方法是将其命名为Id
或添加key
属性。@cidico:我编辑了我的答案,检查它并让我知道这是否是您想要的;)抱歉耽搁了!是这样的,但我不能使用Ip属性作为密钥(因为它有时会重复)。我需要做的和映射IList一样。这是一对多,我需要添加来自父级的Id。与无法向字符串类型添加Id属性的方式相同。我想EF不支持它(