【问题标题】:EF 4.3 Code First one-to-one relationship when using an existing databaseEF 4.3 Code First 使用现有数据库时的一对一关系
【发布时间】:2012-02-22 21:39:08
【问题描述】:

我的数据库中有两个表,它们具有一对一的关系。我想使用代码优先方法通过 EF 访问它们。我写过这样的 POCO 类:

public class User
{
    public int Id { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

    public virtual Profile Profile { get; set; }
}

public class Profile
{
    public int UserId { get; set; }
    public string FullName { get; set; }
    public DateTime? Birthday { get; set; }
    public bool? Male { get; set; }
}

我还在 OnModelCreating 中描述了这些类之间的关系,如 here 所述。所以看起来是这样的:

modelBuilder.Entity<Profile>().HasKey(x => x.UserId);
modelBuilder.Entity<User>().
    HasOptional(u => u.Profile).
    WithRequired();

但是当我运行应用程序时,我在尝试访问用户表时遇到了这个异常:

列名“User_Id”无效

虽然当我让 EF 使用这两个表自己创建一个新数据库时,它会创建一个与我的具有相同结构的数据库并且它可以工作。

我使用的是 EF 4.3(我也尝试过 4.2)和 MS SQL 2008。我做错了什么?我不敢相信这是实体框架的错误。

【问题讨论】:

  • “Code First”表示您还没有数据存储。 :)
  • @rfmodulator,嗯,是的:)但在现实生活中事情并不那么容易。所以你认为 EF 不是为了我尝试使用它的目的而创建/测试的?
  • 同样,“代码优先”意味着您首先定义类,然后框架创建底层数据存储模式。 EF 完全有能力使用现有数据库,我只是指出您所做的不是(!!!)“代码优先。
  • rfmodulator 是正确的 - 在这种情况下,代码优先并不是更好的解决方案。尝试使用模型优先的方法。
  • 您实际上可以做@Z_Core 尝试做的事情,但您需要进入迁移:thedatafarm.com/blog/data-access/…

标签: c# entity-framework-4 ef-code-first entity-framework-4.3


【解决方案1】:

EF 要求一对一的列都共享相同的主键,并且两者之间存在引用 FK。

如果是这种情况,您可以使用 Entity Framework Power Tools CTP1 将您的数据库逆向工程为 Code First 模型。

你可以在这里找到它:http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

【讨论】:

    【解决方案2】:

    谢谢你们,伙计们,你们的帮助。我意识到代码优先不是我应该走的路,我选择了数据库优先的方法。 With the POCO templates for the Entity Framework.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多