gpt4 book ai didi

entity-framework - Entity Framework - 实体只读属性映射到相关表的列

转载 作者:行者123 更新时间:2023-12-02 03:02:19 24 4
gpt4 key购买 nike

我有一个有趣的问题需要解决,但是虽然很常见,但看起来使用 Entity Framework 不容易实现。有两个表:

Player(Id,TeamId,FirstName,LastName)
Team(Id, Name, IsProfessional)

玩家只能属于一个团队。使用 TPT(数据库优先),我们有两个类映射到这些表:

public class Player
{
public int Id{get;set;}
public int TeamId{get;set;}
public string FirstName{get; set;}
public string LastName{get; set;}
public Team Team{get;set;}
}

public class Team
{
public int Id{get; set;}
public string Name{get;set;}
public bool IsProfessional{get;set;}
public IEnumerable<Player> Players{get;}
}

我想要实现的是 Player 实体上的属性 IsProfessional:

public class Player
{
public int Id{get;set;}
public int TeamId{get;set;}
public string FirstName{get; set;}
public string LastName{get; set;}
public Team Team{get;set;}
**public bool IsProfessional{get;}** should be read-only
}

是否可以通过在 linq 查询中使用 IsProfessional 属性的方式配置映射?

var result= db.Players.Where(p=>p.IsProfessional==true);

并在每次实现 Player 实体时填充该字段?

Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault();
if(pl.IsProfessional)
{
//do something...
}

已经尝试过:

  • 实体拆分。不可能,因为我想保留团队映射并且关系不是 1:1)
  • 将玩家实体映射到数据库 View 。不喜欢它,因为玩家实体还有我需要的其他关系。我知道可以手动创建它们,但从数据库更新 edmx 将重置 ssdl。

谢谢

解决方案

根据 Gert Arnold 答案中的第二个选项,适合我需求的解决方案如下:

  1. 我创建函数 GetIsProfessional(必须这样做,因为计算字段通常只能从自己的表字段中生成)

    CREATE FUNCTION [dbo].[GetIsProfessional](@teamId as INT)
    RETURNS bit

    BEGIN

    DECLARE @isProfi AS bit

    SELECT @isProfi = IsProfessional
    FROM Teams
    WHERE Id = @teamId

    RETURN @isProfi

    END
  2. 我在 Player 表上创建了计算字段

    ALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)
  3. 由于我使用数据库优先方法,我只需从数据库更新模型即可,我可以查询该字段,并且在具体化 Player 对象时预先填充该字段。

最佳答案

这是 EF 无法完成的。有些选项并不完全符合您的要求,但或多或​​少接近:

  1. 在您的上下文中创建一个属性 TeamPlayers,该属性返回包含团队的玩家,以便您始终可以执行 player.Team.IsProfessional,即使上下文已经配置完毕。

    public IQueryable<Player> TeamPlayers
    {
    get { return this.Players.Include("Team"); }
    }
  2. 在数据库表中创建一个计算字段,并使用 DatabaseGenerateOption.Compulated 映射到该字段。

  3. Player 中创建一个静态属性,返回访问 Team.IsProfessional 的表达式(需要包含事件上下文或团队):

    public static Expression<Func<Player, bool>> IsProfessional
    {
    get { return p => p.Team.IsProfessional; }
    }
    ...
    db.Players.Where( p=> p.FirstName="Lionel").Where(Player.IsProfessional)....

我更喜欢计算字段,因为它总是被填充,因此您可以在上下文范围内和之外使用它。

关于entity-framework - Entity Framework - 实体只读属性映射到相关表的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12798502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com