Entity framework 如何在EntityFramework5中映射组件列表?

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

我是NHibernate用户,NHibernate允许我创建一个非常细粒度的模型。 我正在将一个应用程序从NHibernate移植到实体框架

NHibernate允许我定义以下内容:

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映射为。 在特殊情况下,当NHibernate创建数据库时,会在LogonInformation表中创建UserId。 如何使用EntityFramework 5实现这一点? 我尝试过使用复杂类型,但似乎不起作用,因为我仍然遇到以下异常:

在模型生成过程中检测到一个或多个验证错误:

\tSystem.Data.Entity.Edm.EdmEntityType::EntityType “LogonInformation”没有定义键。为此定义密钥 EntityType

\tSystem.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet “LogonInformation”基于类型“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不支持它(