wake-up-neo.com

So erstellen Sie eine Ansicht mit EF-Code-First-POCO

So einfach. Ich muss eine Viewusing Code First erstellen. Ich habe darüber weder bei Google noch bei SO etwas gefunden. Gibt es eine Möglichkeit, dies zu erreichen?

Diese Ansicht muss mit linq erstellt und abgefragt werden. Es ist daher keine Lösung, sie mit einem Skript bei der Datenbankerstellung zu erstellen. Beispiel:

var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;

Eine Umgehung ist auch akzeptabel. Ich brauche eine Möglichkeit, Entitäten nach nicht konstanten/Nicht-Entitätswerten abzufragen.

31
Chuck Norris

Sie können keine Ansichten mit dem EF-Code-First-Ansatz erstellen. Wenn Sie eine Ansicht erstellen möchten, führen Sie das Erstellungs-SQL-Skript in der Seed-Methode aus. Sie können dieser Ansicht jedoch immer noch keine Entität zuordnen, mit der Ausnahme, dass Sie das Modell hacken, indem Sie eine Tabelle mit demselben Namen erstellen und löschen, der Ihrer Ansicht entspricht.

Einige hilfreiche Links:

9
Anatolii Gabuza

sie müssen die Ansicht manuell erstellen, genau wie AnatoliiG angegeben hat. ( Index zu einer Tabelle hinzufügen ).

Sie fügen der Klasse den Namen der Sicht als Attribut hinzu

[Table("UserDTO")]
    public class UserDTO
{
    /* Class code here */
}

Sie können eine leere Migration erstellen, indem Sie am Ende das Attribut -IgnoreChanges angeben

Add-Migration MigrationName -IgnoreChanges

Dadurch erhalten Sie ein leeres Migrationsskript, das Sie manuell ändern können. 

Sie können Ihren Datenbankkontext verwenden, um Ihren Code in Ihrem Migrationsskript auszuführen

public partial class editUserDTO : DbMigration
{
    public override void Up()
    {
        string script =
        @"
        CREATE VIEW dbo.UserDTO
        AS SELECT p.PersonId AS UserId, p.FirstName, p.LastName, u.UserName
        FROM dbo.Users u
        INNER JOIN dbo.People p ON u.PersonId = p.PersonId";
        BloggingContext ctx = new BloggingContext();
        ctx.Database.ExecuteSqlCommand(script);
    }

    public override void Down()
    {
        BloggingContext ctx = new BloggingContext();
        ctx.Database.ExecuteSqlCommand("DROP VIEW dbo.UserDTO");
    }
}
58
Fred

Nur ein Heads-Up, in EF 6.1 (nicht sicher, ob in früheren Versionen oder nicht), gibt es jetzt eine Code First from Database-Option, die Sie verwenden können, und es wird auch Ansichten zugeordnet.

Ich persönlich habe meinen in einem separaten Junk-Projekt, so dass ich einfach den gewünschten Code daraus entfernen kann und nicht auf mein Projekt, das die Datenbank tatsächlich verwendet, Einfluss nimmt. Um es zu benutzen, Add a New file to your project -> Data -> ADO.NET Entity Data Model

Wählen Sie dann die Option Code First From Database und wählen Sie Ihre Ansichten (und ggf. andere Tabellen) aus.

Es wird als Table-Mapping erstellt, über das Fred in seiner Antwort gesprochen hat, aber es wird den gesamten Code für Sie erledigen, der Nizza ist. Wahrscheinlich möchten Sie jedoch die Indizes und die Reihenfolge ändern.

Rufen Sie dann einfach Sql(@"YOUR VIEW CREATE SQL HERE") in Ihrer Up auf und fügen Sie eine Sql(@"DROP STATEMENT HERE") in Ihre Down ein.

18
John

Viele gute Einblicke aus dem offiziellen Thread von EF7 :

1) Kein DbSet, sondern eine Eigenschaft oder Erweiterungsmethode

Ein Besitz

class YourContext
{
    public IQueryable<YourView> YourView 
    {
        get
        {
            return this.Database.SqlQuery<YourView>("select * from dbo.YourView");
        }
    }
}

B) Erweiterungsmethode

static class YourContextExtensions
{
    public static IQueryable<YourView>(this YourContext context)
    {
        return context.Database.SqlQuery<YourView>("select * from dbo.YourView");
    }

2) Anscheinend kann der Migrationsprozess bestimmte dbsets ignorieren.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  if (IsMigration)
    modelBuilder.Ignore<YourViewTable>();
 ...
}

(Alle oben genannten sind nicht getestet)

5
Todd

Sie können keine Ansicht aus EF-Code erstellen. Zuerst sollten Sie das Skript zum "Seed" -Skript hinzufügen, um die Ansicht vorab zu füllen. 

0
Debasis