【发布时间】:2018-08-03 23:27:46
【问题描述】:
我有 AspNetUser 实体:
public partial class AspNetUser
{
public string Id { get; set; }
[Required]
[StringLength(256)]
[Index(IsClustered = false, IsUnique = true)]
public string UserName { get; set; }
....
接口:
public interface IProfile
{
string FirstName { get; set; }
string LastName { get; set; }
string Nickname { get; set; }
}
public interface IMembershipEntity
{
string AspNetUserId { get; set; }
AspNetUser AspNetUser { get; set; }
}
还有 2 个实体,每个实体都以 FK 的形式链接到 AspNetUser(都实现了 IProfile 和 IMembershipEntity):
public partial class Driver : IMembershipEntity, IProfile
{
#region IProfile
public string FirstName { get; set; }
public string LastName { get; set; }
public string Nickname { get; set; }
#endregion
#region IMembershipEntity
public string AspNetUserId { get; set; }
[ForeignKey("AspNetUserId")]
public virtual AspNetUser AspNetUser { get; set; }
#endregion
... driver fields
public class User : BaseEntity, IMembershipEntity, IProfile
{
#region IMembershipEntity
public string AspNetUserId { get; set; }
public virtual AspNetUser AspNetUser { get; set; }
#endregion
#region IProfile
public string FirstName { get; set; }
public string LastName { get; set; }
public string Nickname { get; set; }
#endregion
.... user fields
}
现在我需要一个需要从 AspNetUser 获取 FirstName/LastName 的方法,如下所示:
var element = (from i in db.AspNetUsers
select new UserElementDomain()
{
UserId = i.Id,
CompanyName = i.Company.Name,
FirstName = (get FirstName here),
LastName = (get LastName here),
RoleName = i.AspNetRoles.FirstOrDefault().Name,
SMSnumber = i.SMSnumber,
UserName = i.UserName,
.....
}).FirstOrDefault();
怎么做? 我可以向 AspNetUser 添加 2 个属性,例如:
public virtual User User { get; set; }
public virtual Driver Driver { get; set; }
但是怎么说呢,应该是一环还是零环,不用创建UserId/DriverId
即使有了它,我也必须编写如下代码:
FirstName = (i.User!=null)? i.User.FirstName : ((i.Driver!=null)?i.Driver.FirstName : String.Empty)
我不喜欢这段代码,因为当我再添加一个实体时,我必须检查所有代码并再添加一个条件。如何正确执行?可能,使用接口/继承?
【问题讨论】:
-
AspNetUserId也是User和Driver表中的PK 吗?换句话说,他们是否实现了Shared Primary Key Association? -
@IvanStoev 不也不能(客户的限制,他希望有单独的 id)
-
你遇到了麻烦,因为 EF6 对一对一 FK 关系的支持非常有限。这有可能成为 EF Core 吗?
-
@IvanStoev 现在没有机会...
-
太糟糕了。您必须从界面和实体中牺牲显式 FK 属性
AspNetUserId,并且仅依赖导航属性。参见例如stackoverflow.com/questions/50011305/… 或stackoverflow.com/questions/43367293/… 等。
标签: c# entity-framework foreign-keys