5

Можно ли использовать Entity Framework 6 с первым шаблоном кода и написать модели на C# и в IronPython?Код Entity Framework first и ironpython

Фон состоит в том, что в ядре C# определено несколько стандартных моделей, а некоторые специальные модели должны быть определены в IronPython.

EDIT

Пользовательские модели были определены в наших производственных систем для настройки. Модели должны быть загружены и добавлены в DbContext при запуске приложения. Каждая модель является одним файлом/модулем IronPython и будет загружаться из базы данных (как и все остальные скрипты).

Не рабочий образец

Program.cs

using IronPython.Hosting; 
using Microsoft.Scripting.Hosting; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace IronPython_EF 
{ 
    class Program 
    { 
     // Private Member 
     private static SampleContext context; 

     static void Main(string[] args) 
     { 
      // Setup EntityFramework 
      context = new SampleContext(); 

      // Create IronPython 
      var setup = Python.CreateRuntimeSetup(null); 
      var runtime = new ScriptRuntime(setup); 
      var engine = runtime.GetEngine("IronPython"); 
      var scriptScope = engine.CreateScope(); 

      // Set global var 
      scriptScope.SetVariable("DBContext", context); 

      // Load Model 
      ScriptSource modelSource = engine.CreateScriptSourceFromFile("Python\\User.py"); 
      modelSource.Execute(scriptScope); 

      ScriptSource scriptSource = engine.CreateScriptSourceFromFile("Python\\Demo.py"); 
      scriptSource.Execute(scriptScope); 

      // Prevent from exiting 
      Console.ReadLine(); 
     } 
    } 
} 

SampleContext.cs

namespace IronPython_EF 
{ 
    using System; 
    using System.Data.Entity; 
    using System.Linq; 

    public class SampleContext : DbContext 
    { 


     public SampleContext() : base("name=SampleContext") 
     { 

     } 
    } 
} 

User.Py

# ----------------------------------------------- 
# Containing the UserModel 
# ----------------------------------------------- 

# ----------------------------------------------- 
# Import 
from System import Console 
# ----------------------------------------------- 

# 
class User(object): 

    userId = 0 
    userName = "" 

    def __init__(self): 
     pass 

    def get_userId(self): 
     return self.userId; 

    def set_userId(self, value): 
     self.userId = value 

    def get_userName(self): 
     return self.userName; 

    def set_userId(self, value): 
     self.userName = value 

    UserId = property(get_userId, set_userId) 
    UserName = property(get_userName, set_userId) 

Demo.py

# ----------------------------------------------- 
# Demo Python Script, executing something in the 
# Sample-DB-Context 
# ----------------------------------------------- 

# ----------------------------------------------- 
# Import 
from System import Console 
# ----------------------------------------------- 

# 
Console.WriteLine("Executing demo.py") 

# Add User-Model 
userSet = DBContext.Set[User]() 

# Add User instance 
usr = User() 
usr.UserName = "Hallo Welt" 

userSet.Add(usr) 

# Save changes 
DBContext.SaveChanges() 

я получаю исключение, что User не является частью DbContext.

Благодарим за помощь!

+4

Можете добавить более подробную информацию о том, что вы пытаетесь сделать? Вы не сможете просто вывести DbContext на C# и добавить ваши модели IronPython в качестве DbSets (который является типичным примером первого кода), поскольку у вас нет скомпилированных типов, которые вы могли бы ссылаться. Может быть способ динамического создания модели из типов IronPython ... Как/когда будут определяться пользовательские модели и где объекты этого типа получаются с точки зрения приложения/архитектуры? –

+0

@SimonOpelt, чем вы для своего повтора, я добавил еще несколько вопросов к вопросу. – BendEg

+0

Врожденной проблемой с описанным подходом является информация о отсутствующем типе. Как бы модель python (предполагая, что она состоит из простых классов python и учитывая, что аннотации функций существуют только в 3) статически, без примерных экземпляров, содержащих фактические данные, отражающие, какие объекты/свойства существуют? –

ответ

0

Я не уверен, что это возможно, поскольку классы IronPython не являются классами .NET. Возможно, можно написать собственный сопоставитель, который будет генерировать классы для вас из файлов IronPython. Но это может усложняться с отношениями/индексов/ключей и т.д.

Если вы должны держать IronPython, и если вы ищете ОРМ преимуществ EF, то альтернативой будет: http://www.sqlalchemy.org/

Но если вы ищут другую доброту, которую предоставляет EF (миграция и т. д.), тогда это будет немного проблемой.

+0

Что вы имеете в виду с * классами IronPython не являются .Net-классами *? Потому что я могу использовать классы .Net в классах IronPython и IronPython в .NET. Да, я должен держать IronPython, потому что это очень простой DLR-язык. SqlAlchemy, похоже, не работает с IronPython, потому что он создан для cPython. – BendEg

+1

Я имел в виду, что, поскольку это динамический язык, он работает в DLR, который находится поверх CLR. Я считаю, что сантехнику EF будет сложно справиться с этим, но, возможно, есть способы. Например, подумайте о файлах миграции: они должны работать строго типизированным образом, чтобы схема базы данных была прибита. Я просто не вижу, как эта холодная работа с динамическими языками ... но я уверен, что кто-то ее попробовал и доказал, что я ошибаюсь. Удачи вам в этом деле, и я надеюсь увидеть сообщение позже, показывая ваше решение! –

Смежные вопросы