实体框架代码首先和ironpython

时间:2015-02-26 15:56:13

标签: c# entity-framework ironpython sqlanywhere dynamic-language-runtime

是否可以将Entity Framework 6与代码优先模式一起使用,并在C#和IronPython中编写模型?

背景是,c#core中定义了一些标准模型,并且必须在IronPython中定义一些自定义模型。

修改

定制模型在我们的生产系统中定义,以进行定制。应该在应用程序启动时加载模型并将其添加到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的一部分。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我不确定这是否可行,因为IronPython类不是.NET类。 可以编写自定义映射器,而不是从IronPython文件中为您生成类。但是这可能会使关系/索引/键等变得复杂。

如果您必须保留IronPython,并且如果您正在寻找EF的ORM好处,那么另一种方法是:http://www.sqlalchemy.org/

但如果你正在寻找EF提供的其他优点(迁移等),那么这将是一个有点问题。