2

我有我的课程FileDownloadContentModel延伸IBaseContentModel

 public class FileDownloadContentModel : IBaseContentModel
 {

    public string url { get; set; }
    public string filename { get; set; }
    public int downloadPercentage { get; set; }
    public DateTime dateDownloaded { get; set; }
    public byte[] content { get; set; }
 }

这里是IBaseContentModel

 public class IBaseContentModel
 {
    [PrimaryKey]
    public int id { get; set; }

    public IBaseContentModel()
    {
        id = GenerateID();
    }

    protected static int GenerateID()
    {
        DateTime value = DateTime.UtcNow;
        //create Timespan by subtracting the value provided from the Unix Epoch
        TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
        //return the total seconds (which is a UNIX timestamp)
        return (int)span.TotalSeconds;
    }
 }

由于某种原因,sqlite-net 在获取表映射时无法识别主键。它声明主键为空。如果我直接在我的FileDownloadContentModel类中包含 id(主键),它能够将主键识别为 id。

这是一个已知的错误还是我在这里做错了什么?任何帮助表示赞赏,谢谢!

更新

我现在对它进行了更多的研究,这是我的一个愚蠢的错误。我有两个 sqlite 的“实例”,由于某种原因,IBaseContentModel 使用的 sqlite 实例与 FileDownloadContentModel 不同,这就是无法识别主键的原因(因为它不是来自同一个实例)。例如,我的意思是两个完全不同的 sqlite.cs 文件,它们具有不同的包名称。

4

1 回答 1

0

这似乎是.NET 的正常行为。接口并不是真正继承的,它只是强迫你实现它的契约。该实现是独立的,并且不从接口继承任何内容。
这就是以下测试失败的原因:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Reflection;

namespace TestProject2
{
    public interface IMyInterface
    {
        [Description("Test Attribute")]
        void Member();
    }

    [TestClass]
    public class Class1 : IMyInterface
    {
        public void Member()
        {

        }

        [TestMethod]
        public void TestAttributeInheritance()
        {
            Console.WriteLine("Checking interface attribute");
            MethodInfo info = typeof(IMyInterface).GetMethod("Member");
            Assert.AreEqual(1, info.GetCustomAttributes(typeof(DescriptionAttribute), true).Length);

            Console.WriteLine("Checking implementation attribute");
            info = typeof(Class1).GetMethod("Member");
            Assert.AreEqual(1, info.GetCustomAttributes(typeof(DescriptionAttribute), true).Length);
        }
    }
}

结果:

Checking interface attribute  
Checking implementation attribute  
Assert.AreEqual failed. Expected:<1>. Actual:<0>.
于 2013-08-05T22:28:54.470 回答