将实体属性映射到不同的表

时间:2012-12-03 20:40:36

标签: entity-framework ef-code-first

我有两个实体:

public class User 
{
   public int Id { get; set; }
   public string UserName { get; set; }
}

public class Product 
{
   public int Id { get; set; }
   public string Name { get; set; }
   public string CreatedUserName { get; set }
}

我的数据库架构在Products表中包含指向Id表中Products列的外键。我需要一种方法来告诉实体框架导航外键并获取UserName属性的CreatedUserName列的值。

这可能吗?我不希望产品拥有整个用户实体。

谢谢!

2 个答案:

答案 0 :(得分:3)

我正在研究同样的事情,发现了一种叫做“实体分裂”的技术 http://www.deliveron.com/blog/post/Entity-Splitting-in-Code-First-Entity-Framework.aspx

因此,基于您的代码,您可以这样做:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        // Map to the Product table
        .Map(map =>
        {
            map.Properties(p => new {
                p.Id,
                p.Name
            });

            map.ToTable("Product");
        })
        // Map to the User table
        .Map(map =>
        {
            map.Properties(p => new {
                p.CreatedUserName
            });

            map.ToTable("User");
        });
}

答案 1 :(得分:1)

  

这可能吗?我不希望产品拥有整个用户实体。

否,除非您要为您的产品执行数据库视图。您尝试映射的内容不再是真实实体。它更像是一个视图模型,为什么不使用投影?

var productView = context.Products
                         .Where(p => p.Id == ...)
                         .Select(p => new ProductView {
                             Id = p.Id,
                             Name = p.Name,
                             CreatedUserName = p.User.UserName
                         });