【问题标题】:One or zero to many relation without foreign key没有外键的一对或零对多关系
【发布时间】:2012-09-24 13:02:45
【问题描述】:

我需要配置与以下类的关系: 用户有或没有个人资料。结构: 用户:用户ID、用户名、密码 个人资料:用户 ID、全名、地址、电话

public class User
{
    #region Feilds
    public int UserID { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    #endregion

    public virtual Profile Profile { get; set; }
}

public class Profile
{
    #region Fields
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public string Address { get; set; }
    #endregion

    public virtual User User { get; set; }
}

配置:

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
        : base()
    {
        // Primary Key
        this.HasKey(p => p.UserID);

        //Foreign Key
        this.HasOptional(p => p.Profile).
            WithMany().
            HasForeignKey(p => p.UserID);
    }
}

错误:

System.Data.Edm.EdmEntityType: : EntityType 'Profile' 没有定义键。定义此 EntityType 的键。 System.Data.Edm.EdmEntitySet: EntityType: EntitySet “Profiles” 基于未定义键的“Profile”类型。

请帮忙。

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework c#-4.0 ef-code-first


    【解决方案1】:

    Entity 框架中的每个实体都必须定义主键。您的个人资料实体看起来应该摆脱当前的错误:

    public class Profile
    {
        #region Fields
        public int Id {get;set;}
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public string Address { get; set; }
        #endregion
    
        public virtual User User { get; set; }
    }
    

    【讨论】:

    • 知道了,但是如果我们不想添加主键怎么办。就像这张表,逻辑上我不需要主键,因为每个配置文件都与某些特定用户相关?为此类定义密钥将是开销?如果我错了,请纠正。谢谢。
    • 没有主键是一种糟糕的设计实践。实体框架需要每个实体上的主键来跟踪上下文中的实体,因此在使用实体框架时这是必须的。
    • 我对同一个数据库有另一个问题,这让我感到困惑,尽管两者都是相关的。我有一个名为 ATTEMPTED_QUESTIONS(TestCode, CandidateID, QuestionID, GivenAnswer, Marks) 的联结(M 到 M)表,它映射两个以上的实体并具有一些自定义属性,例如(GivenAnswer,Marks)。我在那里不需要主键,EF 也为这个表给出了同样的错误。我该怎么办?请提出建议。
    • 定义键的开销不如索引主键字段的性能增益重要。 stackoverflow.com/questions/840162/… 为每个表定义一个键是很好的数据库设计。
    • 对你的联结表做同样的事情,定义一个主键(你可以创建自动标识列),即使你不需要它,实体框架也需要它。如果您在联结表中只有外键,则根本不需要该表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2014-01-11
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多