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.
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:
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");
}
}
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.
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)
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.