使用导航属性填充计算属性的EntityFramework



基本上我想做的是返回一个只读字符串(用户名),它依赖于导航属性user,只是将名字和姓氏连接在一起。

理想情况下,我只是分配一个值给OwnerUserId,然后使用导航属性来检索数据,如果这是可能的?我想保持模型类尽可能的干净。

任何想法?

<

略模型/strong>

namespace Model
{
public class TicketReply
    {
    public int TicketReplyId { get; set; }
    public string Title { get; set; }
    /* ....more.... */
    /* User ID FK */
    public int OwnerUserId { get; set; }
    /* User Navigation property */
    [ForeignKey("OwnerUserId")]
    [IgnoreDataMember]
    public User User { get; set; }
    /* Here is where I am stuck.... */
    public string UserName
    {
        get { return User.FirstName + " " + User.LastName; }
        set { }
    }
    }
}

*数据库初始化器* -只是为了给出一些上下文

private List<TicketReply> AddReplies(DbContext context)
{
        var replies = new List<TicketReply>
        {
            new TicketReply { TicketReplyId = 1, TicketId = 1, CreatedAt = DateTime.Now, OwnerUserId = 1, Text = "My initial query"},
            new TicketReply { TicketReplyId = 2, TicketId = 1, CreatedAt = DateTime.Now, OwnerUserId = 2, Text = "Test reply."},
            new TicketReply { TicketReplyId = 3, TicketId = 2, CreatedAt = DateTime.Now, OwnerUserId = 1, Text = "Test query"} 
        };
        replies.ForEach(status => context.TicketReplies.Add(status));
        context.SaveChanges();
        return replies;
}

谢谢亚瑟

大致(并根据记忆输入)
使其成为User的一部分,例如……

public class User
{
    [NotMapped] // or from code  "modelBuilder.Entity<User>().Ignore(x => x.UserName);"
    public string UserName
    // your user name implementation
}

你不能只是分配OwnerUserId并期望它工作-用户会当你载入车票时,你就载入了。你也不用'OwnerUserId' in您的fk-entity - for search for User.

你可以用它来'设置'用户'它指向' -它被保存当你第一次做'SaveChanges'。

如…

var user = new User {First = ... Second=...};
db.Tickets.Add(new Ticket{ User = user, ...});
// or...
db.Tickets.Add(new Ticket{ OwnerUserId = ownerid, ...}); // to point to exisitng one you know exists         
db.SaveChanges();
...sometime later on...
var ticket = new Ticket { OwnerUserId = ownerid };
// ticket.User is null - won't work
var ticket = // tickets query // db.Tickets.Where(x => x.TicketId == ticketid).FirstOrDefault();
var username = ticket.User.UserName; // now it works, you have your User loaded

或影响…

var user = db.Users.Where(x => x.UserId == ownerid).FirstOrDefault();
var username = user.UserName;

最新更新